Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да се отървете от блокиране в SQL Server 2005 и C# приложение?

Не мога да видя никакъв изричен обхват на транзакция във вашия код, така че не знам какви ключалки вече са налице, когато правите актуализацията си; също така не е ясно какво ниво на изолация използвате. Но най-често срещаният сценарий в този тип ситуация е, че по-рано в същата транзакция сте издали избор (заключване за четене) на същите редове, които се опитвате да актуализирате по-късно. Това ще доведе до ескалация на заключване и може да доведе до блокиране, ако две транзакции се опитват да направят едно и също нещо:

  1. Транзакция A:изберете със заключване за четене
  2. Транзакция B:изберете със заключване за четене
  3. Транзакция A:актуализация - иска да ескалира блокировката си за четене към заключването awwrite, но трябва да изчака транзакция B да освободи заключването си за четене
  4. Транзакция B:актуализация – иска да ескалира блокировката си за четене към заключването на запис, но трябва да изчака транзакция A да освободи заключването си за четене.

Бинго! блокиране, тъй като и A, и B чакат взаимно да освободят съществуващите си блокировки за четене, преди да могат да извършат своята актуализация.

За да предотвратите това, имате нужда от подсказка за updlock във вашия избор, напр.

select * from table with (updlock) where blah blah

Това ще гарантира, че вашият избор използва заключване за запис вместо заключване за четене, което ще предотврати ескалацията на заключване между едновременни транзакции.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. По-добри техники за изрязване на водещи нули в SQL Server?

  2. 4 типа данни, които да бъдат оттеглени в SQL Server

  3. SSMS резултати към мрежа - CRLF не се запазва при копиране/поставяне - има ли по-добри техники?

  4. Как да получите пълната йерархия с SQL CTE

  5. Вземете само датата от групирането в изберете от колоната DateTime в SQL Server