sql >> Database >  >> RDS >> Mysql

MySQL Deadlock-detectie via PHP

Een deadlock retourneert fout 1213 die u aan de kant van de klant moet verwerken

Merk op dat een deadlock en lock wait verschillende dingen zijn. In een impasse is er geen "mislukte" transactie:ze zijn allebei schuldig. Er is geen garantie welke zal worden teruggedraaid.

Een impasse treedt op in een scenario als dit:

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;

Weet je zeker dat je het niet verwart met wacht op slot?

Een vergrendelingswacht treedt op wanneer een transactie een bron probeert te vergrendelen die al is vergrendeld door een andere transactie.

In het bovenstaande voorbeeld vindt er een lock wait plaats bij stap 3 .

Aangezien dit een normale situatie is (in tegenstelling tot een impasse), die van buitenaf kan worden opgelost door de transactie die de vergrendeling vasthoudt, te plegen of terug te draaien, InnoDB zal niet proberen de transactie terug te draaien die de vergrendeling vasthoudt.

In plaats daarvan annuleert het gewoon de instructie die probeerde de vergrendeling te verkrijgen nadat de time-out is opgetreden.

De time-out is standaard 50 seconden en wordt ingesteld met innodb_lock_wait_timeout .

De mislukte verklaring (die probeerde te verkrijgen het slot) geeft fout 1205 .



  1. basic pyodbc bulk insert

  2. Oracle SQL retourneert rijen op willekeurige wijze wanneer er geen order by-clausule wordt gebruikt

  3. Structuren van twee databases vergelijken?

  4. Android:hoe een contact van de telefoon importeren?