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

TSQL Coba/Tangkap dalam Transaksi atau sebaliknya?

Buka transaksi hanya setelah Anda berada di dalam TRY blok dan tepat sebelum pernyataan yang sebenarnya, dan langsung komit. Jangan menunggu kendali Anda pergi ke akhir kumpulan untuk melakukan transaksi Anda.

Jika terjadi kesalahan saat Anda berada di TRY blok dan Anda telah membuka transaksi, kontrol akan melompat ke CATCH memblokir. Cukup kembalikan transaksi Anda di sana dan lakukan penanganan kesalahan lainnya sesuai kebutuhan.

Saya telah menambahkan sedikit cek untuk setiap transaksi terbuka menggunakan @@TRANCOUNT berfungsi sebelum benar-benar memutar kembali transaksi. Sangat tidak masuk akal dalam skenario ini. Ini lebih berguna ketika Anda melakukan beberapa pemeriksaan validasi di TRY blokir sebelum Anda membuka transaksi seperti memeriksa nilai param dan hal-hal lain dan meningkatkan kesalahan di TRY blokir jika salah satu pemeriksaan validasi gagal. Dalam hal ini, kontrol akan melompat ke CATCH memblokir bahkan tanpa membuka transaksi. Di sana Anda dapat memeriksa apakah ada transaksi terbuka dan kembalikan jika ada yang terbuka. Dalam kasus Anda, Anda benar-benar tidak perlu memeriksa setiap transaksi terbuka karena Anda tidak akan memasukkan CATCH blokir kecuali ada yang tidak beres di dalam transaksi Anda.

Jangan tanya setelah Anda menjalankan DELETE operasi apakah perlu dilakukan atau dibatalkan; lakukan semua validasi ini sebelum membuka transaksi. Setelah transaksi dibuka, lakukan langsung dan jika ada kesalahan, lakukan penanganan kesalahan (Anda melakukan pekerjaan dengan baik dengan mendapatkan info terperinci dengan menggunakan hampir semua fungsi kesalahan).

BEGIN TRY

  BEGIN TRANSACTION SCHEDULEDELETE
    DELETE   -- delete commands full SQL cut out
    DELETE   -- delete commands full SQL cut out
    DELETE   -- delete commands full SQL cut out
 COMMIT TRANSACTION SCHEDULEDELETE
    PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY

BEGIN CATCH 
  IF (@@TRANCOUNT > 0)
   BEGIN
      ROLLBACK TRANSACTION SCHEDULEDELETE
      PRINT 'Error detected, all changes reversed'
   END 
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage
END CATCH


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menentukan nomor port dalam string koneksi SQL Server?

  2. Bagaimana saya bisa memilih hari pertama dalam sebulan di SQL?

  3. Bagaimana cara membagi nilai kolom tunggal menjadi beberapa nilai kolom?

  4. Tidak dapat memasukkan nilai eksplisit untuk kolom identitas dalam tabel 'tabel' ketika IDENTITY_INSERT disetel ke OFF

  5. Bagaimana cara menambahkan atribut khusus ke string koneksi SQL?