Быстрое объяснение, необходимое для блокировки строк в InnoDB
У меня есть клиент-серверное приложение с 2 клиентами:
Мне нужно сделать чтение базы данных эффективным, когда его читает более 1 клиента, и все клиенты не получают одинаковые строки. Я использую движок InnoDB для таблиц, я делаю запросы как SELECT...FOR UPDATE
и я не использую SHARED MODE
Мне нужно объяснение того, как процесс ведет себя в следующих сценариях:
- У меня есть 30 строк в таблице. Каждый клиент имеет один объект подключения к базе данных
- Клиент А получает 15 строк с
SELECT ...FOR UPDATE
, Предполагается, что эти строки заблокированы. - Клиент B должен получить остальные 15 строк, которые не заблокированы Клиентом A, с
SELECT ..FOR UPDATE
соответственно.
Когда я тестировал этот сценарий, у меня был Клиент B, получивший также 15 рядов Клиента A. Почему это происходит? Я поставил setAutoCommit(false)
и никогда не делаю COMMIT
или же ROLLBACK
запрос, поэтому соединение никогда не фиксирует, и блокировки, которые (например, сделал клиент A) были установлены, никогда не освобождаются.
Может ли кто-нибудь указать мне правильное направление? Что я делаю не так?
1 ответ
Я запутался, ты пытаешься заблокировать 15 рядов или нет? Если вы есть, то вам не хватает:
START TRANSACTION
Вот ссылка на документацию по транзакции:
http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html