sql >> Database >  >> RDS >> Sqlserver

Hoe zich te ontdoen van een impasse in een SQL Server 2005- en C#-toepassing?

Ik zie geen expliciete transactieomvang in uw code, dus ik weet niet welke vergrendelingen er al zijn wanneer u uw update uitvoert; ook is het niet duidelijk welk isolatieniveau u gebruikt. Maar het meest voorkomende scenario in dit soort situaties is dat u eerder in dezelfde transactie een select (lees slot) hebt uitgegeven op dezelfde rijen die u later probeert bij te werken. Dit veroorzaakt een escalatie van de vergrendeling en kan leiden tot een impasse als twee transacties hetzelfde proberen te doen:

  1. Transactie A:selecteren met leesvergrendeling
  2. Transactie B:selecteren met leesvergrendeling
  3. Transactie A:update - wil de leesvergrendeling escaleren naar een schrijfvergrendeling, maar moet wachten tot transactie B de leesvergrendeling vrijgeeft
  4. Transactie B:update - wil de leesvergrendeling escaleren naar een schrijfvergrendeling, maar moet wachten tot transactie A de leesvergrendeling vrijgeeft.

Bingo! impasse omdat zowel A als B op elkaar wachten om hun bestaande leesvergrendelingen vrij te geven voordat ze hun update kunnen uitvoeren.

Om dit te voorkomen, heb je een updlock-hint nodig in je selectie, bijvoorbeeld

select * from table with (updlock) where blah blah

Dit zorgt ervoor dat uw selectie een schrijfvergrendeling gebruikt in plaats van een leesvergrendeling, waardoor escalatie van de vergrendeling tussen gelijktijdige transacties wordt voorkomen.



  1. Een efficiënte manier om een ​​array en zijn sleutels in een database op te slaan

  2. Hoe SQL-query naar TXT te exporteren met behulp van de opdrachtregel

  3. Blijf org.hibernate.exception.JDBCConnectionException krijgen:kan query niet uitvoeren

  4. SQL:werk een rij bij en retourneer een kolomwaarde met 1 query