sql >> Databasteknik >  >> RDS >> Mysql

MySQL Deadlock med en insert som höjer en trigger

Tråd 2 har ett delat lås på raden i användartabellen.

Sedan försöker tråd 1 få ett exklusivt lås på samma rad och går in i lås väntan.

Men tråd 1 kommer inte ha en möjlighet att ta timeout, eftersom tråd 2 då försöker eskalera sitt lås till exklusivt... men för att göra det måste han vänta på tråd 1, som är i lås väntan, men den väntar på tråd 2.

De blockerar varandra.

Det är ett dödläge.

Servern väljer en transaktion att döda, så att de inte blockerar varandra i onödan.

Deadlock-detektering tillåter en tråd att omedelbart lyckas på bekostnad av den andra. Annars skulle de båda sitta fast i lås väntan tills en av dem dog av att ha väntat för länge.

Du är i autocommit-läge, men det betyder naturligtvis inte att du inte är i en transaktion. Varje fråga med InnoDB hanteras fortfarande i en transaktion, men med autocommit startas transaktionen implicit när frågan börjar köras och implicit begås när den lyckas.



  1. Håna en MySQL-databas i Python

  2. SQL Server-väntehändelser -1

  3. Hur man använder kolumnnamn när man skapar JSON-objekt, Python

  4. Django + MySQL på Elastic Beanstalk - Fel när du frågar MySQL