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

Dead lock MySQL InnoDB na SELECT s exkluzivním zámkem (PRO AKTUALIZACI)

SELECT FOR UPDATE získá výhradní zámek záměru na stole před získáním výhradního zámku na záznamu.

Proto v tomto scénáři:

X1: SELECT FOR UPDATE -- holds IX, holds X on 'lock_name'
X2: SELECT FOR UPDATE -- holds IX, waits for X on 'lock_name'
X1: INSERT -- holds IX, waits for X for the gap on `id`

dojde k uváznutí, protože obě transakce obsahují IX uzamknout na stole a čekat na X uzamknout záznamy.

Ve skutečnosti je tento scénář popsán v MySQL manuál pro zamykání .

Chcete-li to obejít, musíte se zbavit všech indexů kromě toho, na kterém hledáte, tedy lock_name .

Stačí umístit primární klíč na id .



  1. Hromadná aktualizace Sqlalchemy v MySQL funguje velmi pomalu

  2. Posílejte a získejte zároveň v php

  3. Nastavení místní databáze SQL Server

  4. Podpora transakcí motoru MyIsam