Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Prosedur tersimpan bersarang yang berisi pola TRY CATCH ROLLBACK?

Ini adalah template kami (kesalahan logging dihapus)

Ini dirancang untuk menangani

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL COALESCE GROUPING SET menjadi satu kolom tanpa duplikat NULL

  2. Memulihkan Database SQL Server - Kunci Utama Tidak Dibuka

  3. Pisahkan string yang dipisahkan koma dan sisipkan ke tabel (int)

  4. Ubah Notifikasi dengan Sql Server 2008

  5. Total baris dan kolom dalam pivot dinamis