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
@@TRANCOUNT
sama saat masuk dan keluar -
ketidakcocokan
@@TRANCOUNT
menyebabkan kesalahan 266 karena-
BEGIN TRAN
menambah@@TRANCOUNT
-
COMMIT
mengurangi@@TRANCOUNT
-
ROLLBACK
mengembalikan@@TRANCOUNT
ke nol
-
-
Anda tidak dapat mengurangi
@@TRANCOUNT
untuk cakupan saat ini
Inilah yang menurut Anda adalah "transaksi batin" -
SET XACT_ABORT ON
menekan kesalahan 266 yang disebabkan oleh@@TRANCOUNT
yang 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