Apa manfaat menggunakan SET XACT_ABORT ON
prosedur tersimpan?
sql
sql-server
odiseh
sumber
sumber
Jawaban:
SET XACT_ABORT ON
memerintahkan SQL Server untuk mengembalikan seluruh transaksi dan membatalkan kumpulan ketika kesalahan run-time terjadi. Ini mencakup Anda dalam kasus-kasus seperti batas waktu perintah yang terjadi pada aplikasi klien daripada di dalam SQL Server itu sendiri (yang tidak tercakup olehXACT_ABORT OFF
pengaturan default .)Karena batas waktu kueri akan membiarkan transaksi terbuka,
SET XACT_ABORT ON
disarankan dalam semua prosedur tersimpan dengan transaksi eksplisit (kecuali jika Anda memiliki alasan khusus untuk melakukan hal lain) karena konsekuensi dari aplikasi yang melakukan pekerjaan pada koneksi dengan transaksi terbuka adalah bencana.Ada gambaran yang sangat bagus di Blog Dan Guzman ,
sumber
BEGIN TRY
-BEGIN CATCH
danROLLBACK
denganBEGIN CATCH
blok di Sql?BEGIN TRY
-BEGIN CATCH
tidak akan menangkap hal-hal seperti timeout yang terjadi pada aplikasi klien, dan beberapa kesalahan SQL juga tidak dapat ditandingi, membuat Anda dengan transaksi terbuka di mana Anda tidak akan mengharapkannya.Menurut pendapat saya SET XACT_ABORT ON dibuat usang dengan penambahan BEGIN TRY / BEGIN CATCH di SQL 2k5. Sebelum blok pengecualian dalam Transact-SQL sangat sulit untuk menangani kesalahan dan prosedur yang tidak seimbang terlalu umum (prosedur yang memiliki @@ TRANCOUNT berbeda saat keluar dibandingkan dengan entri).
Dengan penambahan penanganan pengecualian Transact-SQL jauh lebih mudah untuk menulis prosedur yang benar yang dijamin untuk menyeimbangkan transaksi dengan benar. Misalnya saya menggunakan templat ini untuk penanganan pengecualian dan transaksi bersarang :
Ini memungkinkan saya untuk menulis prosedur atom yang hanya mengembalikan pekerjaan mereka sendiri jika terjadi kesalahan yang dapat dipulihkan.
Salah satu masalah utama yang dihadapi prosedur Transact-SQL adalah kemurnian data : kadang-kadang parameter yang diterima atau data dalam tabel benar-benar salah, menghasilkan kesalahan kunci duplikat, kesalahan batasan referensial, periksa kesalahan batasan dan seterusnya dan seterusnya. Bagaimanapun, itulah peran dari kendala ini, jika kesalahan kemurnian data ini menjadi tidak mungkin dan semua tertangkap oleh logika bisnis, semua kendala akan menjadi usang (berlebihan berlebihan untuk efek). Jika XACT_ABORT HIDUP maka semua kesalahan ini mengakibatkan seluruh transaksi hilang, sebagai lawan mampu mengkodekan blok pengecualian yang menangani pengecualian dengan baik. Contoh khas sedang mencoba melakukan INSERT dan kembali ke UPDATE tentang pelanggaran PK.
sumber
Mengutip MSDN :
Dalam praktiknya ini berarti bahwa beberapa pernyataan mungkin gagal, meninggalkan transaksi 'selesai sebagian', dan mungkin tidak ada tanda-tanda kegagalan ini untuk penelepon.
Contoh sederhana:
Kode ini akan mengeksekusi 'berhasil' dengan XACT_ABORT OFF, dan akan berakhir dengan kesalahan dengan XACT_ABORT ON ('INSERT INTO t2' tidak akan dieksekusi, dan aplikasi klien akan memunculkan pengecualian).
Sebagai pendekatan yang lebih fleksibel, Anda dapat memeriksa @@ ERROR setelah setiap pernyataan (old school), atau menggunakan TRY ... CATCH blocks (MSSQL2005 +). Secara pribadi saya lebih suka mengatur XACT_ABORT ON setiap kali tidak ada alasan untuk beberapa penanganan kesalahan lanjut.
sumber
Mengenai batas waktu klien dan penggunaan XACT_ABORT untuk mengatasinya, menurut saya setidaknya ada satu alasan yang sangat baik untuk memiliki batas waktu dalam API klien seperti SqlClient, dan itu adalah untuk menjaga kode aplikasi klien dari kebuntuan yang terjadi dalam kode server SQL. Dalam hal ini kode klien tidak memiliki kesalahan, tetapi harus melindunginya sendiri dari pemblokiran selamanya menunggu perintah untuk diselesaikan di server. Jadi sebaliknya, jika batas waktu klien harus ada untuk melindungi kode klien, demikian juga XACT_ABORT ON harus melindungi kode server dari pembatalan klien, jika kode server membutuhkan waktu lebih lama untuk dieksekusi daripada yang ingin ditunggu oleh klien.
sumber
Ini digunakan dalam manajemen transaksi untuk memastikan bahwa setiap kesalahan mengakibatkan transaksi dibatalkan.
sumber