Как во время транзакции можно предотвратить чтение затронутой строки до завершения транзакции?

. Я почти уверен, что у этого есть простое решение, но я пока не смог его найти.. При наличии базы данных InnoDB MySQL с уровнем изоляции, установленным на SERIALIZABLE, и с учетом следующей операции:

BEGIN WORK;
SELECT * FROM users WHERE userID=1;
UPDATE users SET credits=100 WHERE userID=1;
COMMIT;

я хотел бы убедиться, что, как только выдается выбор внутри транзакции, строка, соответствующая userID = 1, блокируется для читается как до тех пор, пока транзакция не будет выполнена. В настоящее время UPDATE для этой строки будет ждать завершения транзакции, если она находится в процессе, но SELECT просто будет считывать предыдущее значение. Я понимаю, что в данном случае это ожидаемое поведение, но мне интересно, есть ли способ заблокировать строку таким образом, чтобы SELECT также ждал завершения транзакции, чтобы вернуть значения?

Причина, по которой я это ищу, заключается в том, что в какой-то момент и при достаточном количестве одновременных пользователей может случиться так, что, пока выполняется предыдущая транзакция, кто-то еще считывает «кредиты» для вычисления чего-то еще. В идеале код, запущенный кем-то другим, должен дождаться завершения транзакции, чтобы использовать новое значение,потому что в противном случае это может привести к необратимым проблемам рассинхронизации.

Обратите внимание, что я не хочу блокировать для чтения всю таблицу, а только конкретную строку.

Кроме того, я мог бы добавить логическое поле «заблокировано» в таблицы и устанавливать его в 1 каждый раз, когда я начинаю транзакцию, но я действительно не думаю, что это самое элегантное решение, если только нет абсолютно никакого другой способ справиться с этим напрямую через mysql.

5
задан Mahn 31 August 2012 в 03:36
поделиться