Я использую MySql 5.x, и в моем окружении есть таблица с именем CALLS.
Таблица CALLS имеет статус столбца, который принимает перечисление {inprogress, completed}.
Я хочу, чтобы чтение / обновление таблицы было заблокировано по строкам, поэтому:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET AUTOCOMMIT = 0;
SELECT amount from CALLS where callId=1213 FOR UPDATE;
COMMIT
В основном я делаю FOR UPDATE даже в ситуациях, когда мне нужно только прочитать сумму и вернуть. Я считаю, что это позволяет мне гарантировать, что операции чтения / обновления не будут мешать друг другу. Однако мне сказали, что это уменьшит параллелизм приложения.
Есть ли способ добиться такой же согласованности транзакций без накладных расходов на блокировку? Спасибо.


То, что вы там реализовали - если вы не были знакомы с этим - называется пессимистическая блокировка. Вы жертвуете производительностью ради согласованности, что иногда является правильным выбором. По своему профессиональному опыту я обнаружил, что пессимистическая блокировка - это скорее помеха, чем помощь.
Во-первых, это может привести к тупик.
Альтернативой (лучше, imho) является оптимистическая блокировка, где вы делаете предположение, что столкновения происходят нечасто, и вы просто справляетесь с ними, когда они происходят. Вы выполняете свою работу в транзакции, поэтому коллизия не должна оставлять ваши данные в несогласованном состоянии.
Вот дополнительная информация о оптимистическая блокировка в смысле Java, но идеи применимы ко всему.
Отказ от ответственности: MySQL обычно полон сюрпризов, поэтому следующее может быть неверным.
То, что вы делаете, для меня не имеет никакого смысла: вы совершаете фиксацию после SELECT, что должно сломать блокировку. Так что, на мой взгляд, ваш код не должен вызывать каких-либо значительных накладных расходов; но это также не дает улучшений согласованности.
В общем, SELECT FOR UPDATE может быть очень надежным и разумным способом обеспечить согласованность без использования большего количества блокировок, чем действительно необходимо. Но, конечно, его следует использовать только при необходимости. Возможно, вам следует использовать разные пути кода: один (с использованием FOR UPDATE), используемый, когда полученное значение используется в последующей операции изменения. И еще один (без использования FOR UPDATE), используемый, когда значение не нужно защищать от изменений.
Думаю, я наконец понял, КОГДА мне нужно ОБНОВЛЕНИЕ. Если я запрашиваю некоторые столбцы и принимаю некоторые решения по полученным значениям перед внесением изменений; тогда подходит FOR UPDATE. например сохраняю свою собственную таблицу автоинкремента.
Изменения в таблице являются финансовой транзакцией и не должны приводить к противоречиям. Иначе моя компания потеряет на этом деньги. Это было моей мотивацией для использования пессимистической блокировки.