sql >> Databasteknik >  >> RDS >> Sqlserver

Vad är ett dödläge i en databas?

I allmänhet betyder dödläge att två eller flera enheter blockerar vissa källor, och ingen av dem kan avsluta, eftersom de blockerar källor på ett cykliskt sätt.

Ett exempel:Låt oss säga att jag har tabell A och tabell B, jag måste göra lite uppdatering i A och sedan B och jag bestämmer mig för att låsa båda vid användningsögonblicket (det här är verkligen dumt beteende, men det tjänar sitt syfte nu ). I samma ögonblick gör någon annan samma sak i motsatt ordning - låser först B, sedan låser A.

Kronologiskt händer detta:

proc1:Lås A

proc2:Lås B

proc1:Lås B - börjar vänta tills proc2 släpper B

proc2:Lås A - börjar vänta tills proc1 släpper A

Ingen av dem kommer någonsin att sluta. Det är ett dödläge. I praktiken resulterar detta vanligtvis i timeout-fel eftersom det inte är önskvärt att ha någon fråga hängande för alltid, och det underliggande systemet (t.ex. databasen) kommer att döda frågor som inte avslutas i tid.

Ett verkligt exempel på ett dödläge är när du låser in dina husnycklar i din bil och dina bilnycklar i ditt hus.



  1. Förhindra infogning av överlappande datumintervall med en SQL-utlösare

  2. Vilket är det bästa sättet att utföra paginering på SQL Server?

  3. SQL Senaste bilder från kontakter (grupperade efter kontakt)

  4. #1072 nyckelkolumn finns inte fel med MySQL främmande nyckel