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