sql >> Databasteknik >  >> RDS >> Mysql

hur man undviker dödläge i mysql

Såvitt jag förstår får en select inte lås och bör inte vara orsaken till dödläget.

Varje gång du infogar/uppdaterar/eller tar bort en rad, erhålls ett lås. För att undvika dödläge måste du sedan se till att samtidiga transaktioner inte uppdaterar rad i en ordning som kan resultera i ett dödläge. Generellt sett, för att undvika dödläge måste du alltid skaffa lås i samma ordning även i olika transaktioner (t.ex. alltid tabell A först, sedan tabell B).

Men om du inom en transaktion bara infogar i en tabell är detta villkor uppfyllt, och detta bör då vanligtvis inte leda till ett dödläge. Gör du något annat i transaktionen?

Ett dödläge kan dock inträffa om det finns saknade index . När en rad infogas/uppdatera/ta bort, måste databasen kontrollera de relationella begränsningarna, det vill säga se till att relationerna är konsekventa. För att göra det måste databasen kontrollera de främmande nycklarna i de relaterade tabellerna. Det kan resultera i att annat lås förvärvas än raden som ändras. Se då till att alltid ha index på de främmande nycklarna (och naturligtvis primärnycklarna), annars kan det resultera i ett tabelllås istället för ett radlås . Om bordslåsning inträffar är låsstriden högre och sannolikheten för dödläge ökar.

Inte säker på vad som händer exakt i ditt fall, men det kanske hjälper.



  1. Varför infogas inte arabiska bokstäver i databasen?

  2. MYSQL hur man låser upp tabell om jag använde kommandot LOCK table table_name WRITE;

  3. JPA @Version-fältet ökas inte

  4. Åtkomst nekad för användaren 'root'@'localhost' med PHPMyAdmin