sql >> Databáze >  >> RDS >> Mysql

Detekce zablokování MySQL pomocí PHP

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 .



  1. Jak používat tabulky Oracle PLSQL (asociativní pole nebo index podle tabulky)

  2. MySQL CONCAT(řetězec,dlouhý text) má za následek hexadecimální řetězec

  3. MySQL je dobrý způsob, jak vložit řádek, pokud nebyl nalezen, nebo jej aktualizovat, pokud je nalezen

  4. Jak nainstalovat a nakonfigurovat Zabbix na Ubuntu 20.04