Использую mysql транзакции в своем приложении на node.js, есть несколько вопросов по поводу них:
1) SELECT ... FOR UPDATE - На каком моменте снимается блокировка с записи? Когда я сделаю UPDATE этой же самой записи или когда я сделаю ROLLBACK/COMMIT всей сессии моего запроса?
2) С помощью SELECT ... FOR UPDATE я выбрал какие-то данные, однако они мне не удовлетворяют. Обязательно ли делать ROLLBACK (ведь по сути возвращаться то некуда), либо достаточно закрыть соединение текущей сессии запроса и блокировка снимется?
This is the default isolation level for InnoDB. Consistent reads within the same transaction read the snapshot established by the first read. This means that if you issue several plain (nonlocking) SELECT statements within the same transaction, these SELECT statements are consistent also with respect to each other. See Section 14.5.2.3, “Consistent Nonlocking Reads”.
For locking reads (SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE, and DELETE statements, locking depends on whether the statement uses a unique index with a unique search condition, or a range-type search condition.
For a unique index with a unique search condition, InnoDB locks only the index record found, not the gap before it.
For other search conditions, InnoDB locks the index range scanned, using gap locks or next-key locks to block insertions by other sessions into the gaps covered by the range. For information about gap locks and next-key locks, see Section 14.5.1, “InnoDB Locking”.
1) Да, блокировки снимутся после окончания транзакции
2) В зависимости от того, как у Вас настроен клиент и какие действия будут выполнены по отсоединению. По умолчанию, насколько помню, при дисконнекте будет выполнен COMMIT, потому делать ROLLBACK обязательно.
По первому вопросу - правильно я понимаю, что при настройках по умолчанию SELECT FOR UPDATE ждет именно окончание транзакции (ключевой запрос commit/rollback), а не update самого селекта?
Я бы даже слово добавил: блокировки снимутся только после окончания транзакции.
Вернуть блокировку до окончания транзакции невозможно (кроме некоторых нетранзакционных блокировок).
При обрыве соединения будет сделан rollback - ведь commit не сказали, база не может знать завершена ли транзакция и потому единственный вариант - откатывать. Но про клиента ремарка хорошая, неизвестно, вдруг клиент как раз перед отключением вызывает неяный commit.