Zablokování vrátí chybu 1213
které byste měli zpracovat na straně klienta
Všimněte si, že zablokování a čekání na zámek jsou různé věci. V patové situaci neexistuje žádná „neúspěšná“ transakce:vinni jsou oba. Neexistuje žádná záruka, která z nich bude vrácena zpět.
Zablokování nastane ve scénáři, jako je tento:
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;
Jste si jisti, že si to nepletete s čekacím zámkem?
Čekání na uzamčení nastane, kdykoli se transakce pokusí uzamknout zdroj, který je již zamčený jinou transakcí.
Ve výše uvedeném příkladu nastává čekání na zámek v kroku 3
.
Protože se jedná o normální situaci (na rozdíl od zablokování), kterou lze vyřešit zvenčí potvrzením nebo vrácením transakce, která drží zámek, InnoDB
se nepokusí vrátit zpět transakci, která drží zámek.
Místo toho pouze zruší příkaz, který se pokusil získat zámek po uplynutí časového limitu.
Ve výchozím nastavení je časový limit 50
sekund a nastavuje se pomocí innodb_lock_wait_timeout
.
Neúspěšný příkaz (ten, který se pokusil získat zámek) vrátí chybu 1205
.