Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wykrywanie zakleszczeń MySQL przez PHP

Zakleszczenie zwraca błąd 1213 które należy przetworzyć po stronie klienta

Zauważ, że zakleszczenie i oczekiwanie na blokadę to różne rzeczy. W impasie nie ma transakcji „nieudanej”:obaj są winni. Nie ma gwarancji, który zostanie wycofany.

W takim scenariuszu dochodzi do impasu:

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;

Czy na pewno nie mylisz tego z oczekiwaniem na blokadę?

Oczekiwanie na blokadę występuje, gdy transakcja próbuje zablokować zasób już zablokowany przez inną transakcję.

W powyższym przykładzie oczekiwanie na blokadę występuje w kroku 3 .

Ponieważ jest to normalna sytuacja (w przeciwieństwie do zakleszczenia), którą można rozwiązać z zewnątrz przez zatwierdzenie lub wycofanie transakcji, która utrzymuje blokadę, InnoDB nie będzie próbował wycofać transakcji, która blokuje.

Zamiast tego po prostu anuluje instrukcję, która próbowała uzyskać blokadę po upływie limitu czasu.

Domyślny limit czasu to 50 sekund i jest ustawiana za pomocą innodb_lock_wait_timeout .

Nieudana instrukcja (ta, która próbowała nabyć blokada) zwróci błąd 1205 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ranking wspólnych pozycji w MySQL

  2. Ustaw wartość AUTO_INCREMENT poprzez zmienną w MySql

  3. ...mysql2/mysql2.so:[BŁĄD] Błąd segmentacji ruby ​​2.0.0p247

  4. Nie można załadować stref czasowych?

  5. Błąd Mysql InnoDB 32 w systemie Windows