Застой връща грешка 1213
които трябва да обработите от страна на клиента
Имайте предвид, че изчакването на безизходица и заключване са различни неща. В задънена улица няма „неуспешна“ транзакция:и двамата са виновни. Няма гаранция кой от тях ще бъде върнат назад.
Застой възниква в сценарий като този:
UPDATE t_first -- transacion 1 locks t_first
SET id = 1;
UPDATE t_second -- transaction 2 locks t_second
SET id = 2;
UPDATE t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET id = 2;
UPDATE t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET id = 2;
Сигурни ли сте, че не го бъркате с изчакване за заключване?
Изчакване на заключване възниква всеки път, когато транзакция се опита да заключи ресурс, вече заключен от друга транзакция.
В примера по-горе се получава изчакване на заключване на стъпка 3
.
Тъй като това е нормална ситуация (за разлика от безизходица), която може да бъде разрешена отвън чрез извършване или връщане назад на транзакцията, която държи заключването, InnoDB
няма да се опитва да върне обратно транзакцията, която държи заключването.
Вместо това той просто ще отмени изявлението, което се е опитало да получи заключването, след като настъпи изтичането на времето.
Времето за изчакване по подразбиране е 50
секунди и се задава с помощта на innodb_lock_wait_timeoutкод>
.
Неуспешното изявление (това, което се опита да придоби ключалката) ще върне грешка 1205
.