@renat-911

SELECT ... FOR UPDATE в innoDB не лочит записи. Я и дальше могу обращаться к записи. Почему не происходит лока?

Тестирую SELECT FOR UPDATE в своей таблице innoDB. Но мне не удается нарваться на лок. Хотелось бы убедиться в том, что оно действительно работает. Делаю следующее.

Запускаю вот такой процесс:
set autocommit=0;
start transaction;
SELECT * FROM user_balance WHERE id = 1 FOR UPDATE;
SLEEP(10);
UPDATE user_balance SET value = '123' WHERE id = 1;
commit;


И параллельно, пока это все дело выполняется, выполняю следующий запрос:
SELECT * FROM user_balance WHERE id = 1

В итоге второй параллельный процесс без проблем возвращает мне запись (еще не измененную). После завершения благополучно возвращает мне измененную запись.

Я пробовал разные вариации (без оборачивания в транзакцию в том числе)
Я что-то делаю не так?
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
@renat-911 Автор вопроса
Решено. Все работает, но только для параллельных запросов с FOR UPDATE, а я пробовал поймать лок с запросом без FOR UPDATE. То есть мой параллельный запрос должен был выглядеть не так:
SELECT * FROM user_balance WHERE id = 1
А вот так:
SELECT * FROM user_balance WHERE id = 1 FOR UPDATE
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
Вам надо установить уровень изоляции:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; - тогда будете ждать
Ответ написан
Adamos
@Adamos
А есть ли индекс на id?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы