Ini adalah template kami (kesalahan logging dihapus)
Ini dirancang untuk menangani
- Artikel Paul Randal "Tidak ada yang namanya transaksi bersarang di SQL Server"
- Kesalahan 266
- Memicu Rollback
Penjelasan:
-
semua TXN dimulai dan komit/kembalikan harus dipasangkan sehingga
@@TRANCOUNTsama saat masuk dan keluar -
ketidakcocokan
@@TRANCOUNTmenyebabkan kesalahan 266 karena-
BEGIN TRANmenambah@@TRANCOUNT -
COMMITmengurangi@@TRANCOUNT -
ROLLBACKmengembalikan@@TRANCOUNTke nol
-
-
Anda tidak dapat mengurangi
@@TRANCOUNTuntuk cakupan saat ini
Inilah yang menurut Anda adalah "transaksi batin" -
SET XACT_ABORT ONmenekan kesalahan 266 yang disebabkan oleh@@TRANCOUNTyang tidak cocok
Dan juga menangani masalah seperti ini "Waktu Transaksi SQL Server" di dba.se -
Hal ini memungkinkan untuk TXN sisi klien (seperti LINQ)Satu prosedur tersimpan dapat menjadi bagian dari transaksi terdistribusi atau XA, atau hanya satu yang dimulai dalam kode klien (misalnya .net TransactionScope)
Penggunaan:
- Setiap proc yang disimpan harus sesuai dengan template yang sama
Ringkasan
- Jadi, jangan buat TXN lebih dari yang Anda butuhkan
Kode
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;
THROW;
--before SQL Server 2012 use
--RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
Catatan:
-
Pemeriksaan rollback sebenarnya berlebihan karena
SET XACT_ABORT ON. Namun, itu membuat saya merasa lebih baik, terlihat aneh tanpanya, dan memungkinkan situasi di mana Anda tidak menginginkannya -
Remus Rusanu memiliki cangkang serupa yang menggunakan save point. Saya lebih suka panggilan DB atom dan tidak menggunakan pembaruan parsial seperti artikel mereka