Как заблокировать связанные строки, чтобы любой выбор по ним ожидал завершения транзакции?

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

Если какое-либо действие будет отправлено дважды одновременно, они оба смогут захватить один и тот же игровой сеанс, захватить последнее состояние игры и сравнить его с действием. Транзакция, кажется, только предотвращает запись любой строки, которая была изменена в транзакции. Какой бы удар не был нанесен второму, он подождет, пока первый не будет сделан, затем запишет свои данные и создаст следующее игровое состояние.

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

Я не смог выяснить, как я могу создать блокировку чтения строки. Может ли кто-нибудь помочь мне? Благодарю.

РЕДАКТИРОВАТЬ:

Я думаю, что мне нужно сделать строку транзакции SELECT FOR UPDATE внутри транзакции, и это заблокирует строку для чтения, но затем перед транзакцией у меня будет строка сеанса игры SELECT LOCK IN SHARE MODE, чтобы убедиться, что она дожидалась его может начать это?

Не уверен, правильно ли я их использую.

Где-то в моем PHP-коде, абстрагированном от PDO (особенно Eloquent):

SELECT FROM game_session WHERE id = 5 LOCK IN SHARE MODE; #wait till any lock is completed
BEGIN TRANSACTION;
SELECT FROM game_session WHERE id = 5 FOR UPDATE; #lock the row
/* stuff */
END TRANSACTION;

Это кажется немного излишним. Я знаю, что есть также много для уровня изоляции транзакции, хотя я не знаю, где это будет связано, нужен ли SERIALIZABLE? Или это испортит бит «ДЛЯ ОБНОВЛЕНИЯ»?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]