SORU
15 Ocak 2010, Cuma


Saklı yordamları içeren geri alma desen CATCH iç içe?

Yan etkileri ve desene potansiyel sorunlarla ilgileniyorum:

CREATE PROCEDURE [Name]
AS
BEGIN
    BEGIN TRANSACTION
    BEGIN TRY
        [...Perform work, call nested procedures...]
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
        RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
    END CATCH
END

Benim anladığım bu model tek bir prosedür prosedür ya da hata olmadan onun tüm ifadeleri tamamlayacak, ya da tüm eylemleri geri alma ve hata raporu ile kullanıldığında ses.

Ancak ne zaman bir saklı yordam çağrıları başka bir saklı yordam için alt birim iş (bu bağlamda küçük işlemdir bazen kendi kendine) gördüğüm bir konu hakkında gelecek ile ilgili al - bir bilgi iletisi (Seviye 16) verilmiş belirten The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.. Sanırım bu alt yordam içinde geri alma her zaman en dıştaki işlem, sadece alt yordam başladı işlem geri alınıyor olmasıdır.

Ben yapmak istiyorum hepsini geri ve iptal durumunda herhangi bir hata oluştuğunda (hata bildirdi için istemci olarak bir SQL hata), ben sadece emin tüm yan etkiler gelen dış katmanları çalışırken geri almak için bir işlem bu zaten geri alınıyor. @@TRANCOUNT Bir check her bir geri alma yapmadan önce YAKALAMAK katman DENEYİN belki?

Sonunda kendi hareket katmanı olan istemci sonunda (Linq2SQL), var:

try
{
    var context = new MyDataContext();
    using (var transaction = new TransactionScope())
    {       
            // Some Linq stuff
        context.SubmitChanges();
        context.MyStoredProcedure();
        transactionComplete();
    }
}
catch
{
    // An error occured!
}

Bu olay bir saklı yordam,"", denir . MySubProcedure bu ^em>içindeMyStoredProcedure yükseltir bir hata, emin olabilirim her şeyi önceden yapılan MyStoredProcedure olacak geri, tüm Seri operasyonlar yapılmış SubmitChanges olacak geri, ve son olarak bu hata günlüğe? Ya da ne kadar değiştirmek benim desen sağlamak için tüm operasyon, atom, ise hala izin çocuk parçaları için kullanılan ayrı ayrı (yani alt-prosedürler gerektiğini hala aynı atom koruma)

CEVAP
15 Ocak 2010, Cuma


Bu bizim şablon (hata kaldırıldı günlüğü)

Bu işlemek için tasarlanmıştır

  • Paul randal'ın Madde 20**
  • Hata 266
  • Tetik Al

Açıklamalar:

  • tüm TXN begin ve commit/al @@TRANCOUNT giriş ve çıkışta aynı eşleştirilecek

  • @@TRANCOUNT uyuşmazlıkları 266 çünkü hata neden

    • BEGIN TRAN artırır @@TRANCOUNT

    • COMMIT @@TRANCOUNT azaltır

    • ROLLBACK 14 döndürür* *sıfır

  • Geçerli kapsam için @@TRANCOUNT indirim yapabilirsiniz
    Bu düşünürsünüz nedir "" . iç işlem

  • SET XACT_ABORT ON hata 266 uyumsuz kaynaklanan @@TRANCOUNT bastırır
    Ve ayrıca dba "SQL Server Transaction Timeout" Bu gibi konularla ilgileniyor.se

  • Bu istemci tarafı TXNs (SERİ gibi)sağlar Tek bir saklı yordam dağıtılmış veya XA hareket, ya da sadece tek bir müşteri kodu başlattı (demek tarafı olabilir .net) Current

KULLANIMI:

  • Her saklı yordam aynı şablona uygun olmalıdır

ÖZET

  • Bu nedenle ihtiyacınız olandan daha fazla TXNs oluşturmak yok

Ancak

CREATE PROCEDURE [Name]
AS
SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int

BEGIN TRY
    SELECT @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0
        BEGIN TRANSACTION

       [...Perform work, call nested procedures...]

    IF @starttrancount = 0 
        COMMIT TRANSACTION
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO

Notlar:

  • Geri alma onay aslında SET XACT_ABORT ON çünkü gereksiz. Ancak, beni daha iyi hissettiriyor, tuhaf olmadan görünüyor, ve bunu istiyor musun durumlar için sağlar

  • Remus Rusanu puan kaydetmek kullanan similar shell vardır. Atom DB aramayı tercih ederim ve onların madde gibi kısmi güncelleştirmeleri kullanmayın

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobono1baby

    bobono1baby

    14 AĞUSTOS 2011
  • Creavite

    Creavite

    8 Mart 2009
  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007