sql >> Database teknologi >  >> RDS >> Mysql

MySQL Deadlock Detection via PHP

En deadlock returnerer fejlen 1213 som du skal behandle på klientsiden

Bemærk, at en deadlock og låsevent er forskellige ting. I et dødvande er der ingen "mislykket" transaktion:de er begge skyldige. Der er ingen garanti for, hvilken der vil blive rullet tilbage.

Et dødvande opstår i et scenarie som dette:

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;

Er du sikker på, at du ikke forveksler det med en låst ventetid?

En låsevent opstår, når en transaktion forsøger at låse en ressource, der allerede er låst af en anden transaktion.

I eksemplet ovenfor sker en låsevent på trin 3 .

Da dette er en normal situation (i modsætning til en dødvande), som kan løses udefra ved at begå eller rulle tilbage den transaktion, der holder låsen, InnoDB vil ikke forsøge at rulle den transaktion tilbage, der holder låsen.

I stedet vil den blot annullere den erklæring, der forsøgte at hente låsen, efter timeoutet indtræffer.

Timeout er som standard 50 sekunder og indstilles ved hjælp af innodb_lock_wait_timeout .

Den mislykkede erklæring (den, der forsøgte at erhverve låsen) vil returnere fejlen 1205 .



  1. Problem med utf-8-kodning ved hjælp af PHP + MySQL

  2. Er der en måde at hente autoincrement-id'et fra en forberedt erklæring

  3. Sådan får du måneden fra en dato i T-SQL

  4. hvordan man kontrollerer, at wordpress brugerdefineret tabel er tom eller ej