Mark'ın cevabı genişletiliyor ...
Bir istemci zaman aşımı olayı oluştuğunda (örneğin .net CommandTimeout), istemci SQL Server'a "ABORT" gönderir. SQL Server daha sonra sadece sorgu işlemeyi bırakır. Hiçbir işlem geri alınmaz, kilit serbest bırakılmaz.
Şimdi, bağlantı bağlantı havuzuna döndürülür, bu nedenle SQL Server'da kapatılmaz. Bu gerçekleşirse (KILL veya istemci yeniden başlatma vb. Yoluyla) işlemler + kilitler silinir. Sp_reset_connection, reklamı yapılsa bile bunları temizlemeyeceğini veya temizlemeyeceğini unutmayın
Durdurma işleminden kaynaklanan bu detritus, diğer işlemleri engelleyecektir.
SQL Server'ın, istemci zaman aşımı (kesinlikle ABORT olayları) üzerinde net işlemler + kilitler oluşturmanın yolu SET XACT_ABORT ON kullanmaktır.
Bunun SSMS'de 2 sorgu penceresi açtığını doğrulayabilirsiniz:
Pencere 1:
Query..Query Options menüsünde 5 saniyelik bir zaman aşımı süresi ayarlayın ve bunu çalıştırın
BEGIN TRAN
UPDATE sometable WITH (TABLOCKX) SET foo = foo WHERE 1 = 0;
WAITFOR DELAY '00:00:10' -- just has to be longer then timeout
Pencere 2, bu sonsuza kadar bekler (veya zaman aşımına uğrar)
SELECT * FROM sometable
SET XACT_ABORT ON'un da ilginç yan etkileri var:
- @@ TRANCOUNT, örtülü geri almada sıfıra ayarlandı, ancak 266 hatası bastırıldı (bu, @@ TRANCOUNT depolanan bir işlemden giriş ve çıkışta farklıysa gerçekleşir)
- XACT_STATE -1 olacak ("mahkum")
Bunun birleşimi, SAVEPOINTS'i (kesin davranışı hatırlayamama rağmen) kısmi taahhütler / geri almalar için kullanamayacağınız anlamına gelir. Hangisi bana uygun
SET XACT_ABORT üzerindeki SO bağlantıları:
Yuvalanmış saklı işlemlerde:
Sp_reset_connection üzerinde: