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
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 nedenBEGIN TRAN
artırır@@TRANCOUNT
COMMIT
@@TRANCOUNT
azaltırROLLBACK
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şlemSET XACT_ABORT ON
hata 266 uyumsuz kaynaklanan@@TRANCOUNT
bastırır
Ve ayrıca dba "SQL Server Transaction Timeout" Bu gibi konularla ilgileniyor.seBu 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ğlarRemus 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
Geri alma git reset?...
Varlık Çerçevesi Üzerinde Başlatma/Ger...
Sessizce'nın saklı yordamları, SQ...
Neden't kapasiteli geri catch den...
GRANT tüm saklı yordamları YÜRÜTMEK...