SQL Server İşlem Zaman Aşımı


9

SQL Server 2008 R2'de bir işlemi içeren bir veritabanı değişikliği için zaman aşımına neden olmanın bir yolu var mı? Uygulama kodumuzun askıda kaldığı veya istisna oluşturduğu ve geri alma veya taahhütte bulunmadığı bir senaryomuz var. Bu işlemin tamamlanmasını bekleyen diğer oturumların askıda kalmasına neden olur.

Yanıtlar:


20

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:


Gelecek merhaba diyor! "Sp_reset_connection, reklamı yapılsa bile onları temizlemeyeceğini veya temizlemediğini unutmayın" - SQL Server'ın güncel sürümlerinde bunun doğru olduğuna inanmıyorum?
kamilk

11

Sorunun açıklamasında, bunun en iyi tavsiye olduğundan% 100 emin olmak için yeterli bilgi olmadığı için bunu tereddütle cevaplıyorum. "Askıda kalır veya istisna atar" sorunun kaynağının doğru anlaşılmadığını gösterir, bu yüzden dikkatli olun.

Bunun en basit çözümü muhtemelen SET XACT_ABORT ON.

XACT_ABORTSQL Server'ın çalışma zamanı hatası durumunda bir işlemi geri alıp almayacağını belirler. Varsayılan SET XACT_ABORT OFF, yalnızca hataya neden olan ifadeyi geri alır ve üst işlemleri açık bırakır.

Varsayılan ayarın "gotcha" yan etkisi, bir zaman aşımının tamamen aynı soruna neden olabileceğidir, istemcilerin işlemesi ve geri alması için açık bir işlemdir. Müşteri denemeyi / yakalamayı / geri almayı denemezse, işlemin aşırı şiddetine katılana kadar (ve ben @gbn'den alıntı yapıyorum) açık kalacaktır KILL <spid>.

Sık sık alıntılanan Erland Sommarskog en makaleler , SQL Server hata işleme tüm daha bu senaryoların ve başa çıkmak için gereken arka plan ve strateji içermektedir.

Düzenle (yorumu takip ederek): Açık işlemleri tanımlamak için, sp_whoisactive muhtemelen en eksiksiz özelliktir.


Bazı Googling ile, asmak gerçekleştiğinde açık işlemleri bulmanın yollarını buldum - belki de bu en iyi çözümdür. Bu, kodda kapatılmamış işlemin nedenini bulmak ve koddaki delikleri düzeltmektir. Diğerleri için referans içindir. DBCC OPENTRAN en eski etkin işlemi döndürür -> msdn.microsoft.com/en-us/library/ms182792.aspx Yoksa buna benzer bir şey mi? -> weblogs.sqlteam.com/mladenp/archive/2008/04/29/…
David Gray Wright

Her zaman Erland'ın
gbn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.