Не мога да видя никакъв изричен обхват на транзакция във вашия код, така че не знам какви ключалки вече са налице, когато правите актуализацията си; също така не е ясно какво ниво на изолация използвате. Но най-често срещаният сценарий в този тип ситуация е, че по-рано в същата транзакция сте издали избор (заключване за четене) на същите редове, които се опитвате да актуализирате по-късно. Това ще доведе до ескалация на заключване и може да доведе до блокиране, ако две транзакции се опитват да направят едно и също нещо:
- Транзакция A:изберете със заключване за четене
- Транзакция B:изберете със заключване за четене
- Транзакция A:актуализация - иска да ескалира блокировката си за четене към заключването awwrite, но трябва да изчака транзакция B да освободи заключването си за четене
- Транзакция B:актуализация – иска да ескалира блокировката си за четене към заключването на запис, но трябва да изчака транзакция A да освободи заключването си за четене.
Бинго! блокиране, тъй като и A, и B чакат взаимно да освободят съществуващите си блокировки за четене, преди да могат да извършат своята актуализация.
За да предотвратите това, имате нужда от подсказка за updlock във вашия избор, напр.
select * from table with (updlock) where blah blah
Това ще гарантира, че вашият избор използва заключване за запис вместо заключване за четене, което ще предотврати ескалацията на заключване между едновременни транзакции.