Transaksi dan Coba-tangkap dalam Pekerjaan SQL Server
9
Kami memiliki operasi DML di setiap langkah pekerjaan SQL Server. Untuk memastikan update / insert akan digulung kembali jika sesuatu berjalan salah, saya telah membungkus modifikasi data setiap langkah dalam TRY CATCHdan TRANSACTIONblok:
Transaksi yang Tidak Terjanjikan dan XACT_STATE
Jika kesalahan yang dihasilkan dalam blok TRY menyebabkan keadaan transaksi saat ini menjadi tidak valid, transaksi tersebut diklasifikasikan sebagai transaksi yang tidak dapat dipastikan. Kesalahan yang biasanya mengakhiri transaksi di luar blok TRY menyebabkan transaksi memasuki kondisi yang tidak dapat dikomit ketika kesalahan terjadi di dalam blok TRY. Transaksi yang tidak dapat dilakukan hanya dapat melakukan operasi baca atau TRANSAKSI ROLLBACK. Transaksi tidak dapat menjalankan pernyataan Transact-SQL apa pun yang akan menghasilkan operasi penulisan atau TRANSAKSI KOMIT. Fungsi XACT_STATE mengembalikan nilai -1 jika transaksi telah diklasifikasikan sebagai transaksi yang tidak dapat dilakukan. Ketika batch selesai, Mesin Database memutar kembali setiap transaksi aktif yang tidak dapat dilakukan. Jika tidak ada pesan kesalahan yang dikirim saat transaksi memasuki kondisi yang tidak dapat diterima, ketika batch selesai, pesan kesalahan akan dikirim ke aplikasi klien. Ini menunjukkan bahwa transaksi yang tidak dapat dideteksi terdeteksi dan dibatalkan.
Kode Anda memeriksa @@TRANCOUNTdi tempat-tempat di mana itu tidak dapat 0, ia menggunakan campuran pesan PRINT informasi dan set hasil SELECT untuk berkomunikasi keberhasilan, itu tidak menangani kesalahan yang dapat dipulihkan. Idealnya pengecualian harus menyebar ke klien, dalam hal ini untuk pekerjaan Agen (mis. Tangkapan Anda harus naik kembali).
Terima kasih atas jawaban Anda yang bermanfaat dan situs web yang fantastis! Namun saya bertanya-tanya apakah masih saya dapat menggunakan pola ini dengan pernyataan DML sederhana (bukan proc tersimpan)? Juga apakah kita harus menyimpan transaksi seperti di bawah ini? (Saya tidak punya proc toko untuk digunakan): simpan transaksi usp_my_procedure_name;
Langit
2
Apa yang Anda miliki terlihat bagus untuk saya. Saya akan menyarankan melakukan sesuatu dengan informasi tentu saja setelah Anda memutar kembali transaksi misalnya menuliskannya ke log.
Terima kasih atas balasan Anda, bisakah Anda memberi saya petunjuk bagaimana cara menulisnya ke log?
Langit
3
Jika Anda ingin menulis kesalahan atau data ke tabel log, maka sebelum Anda melakukan rollback, salin data yang Anda inginkan ke variabel tabel (Sangat penting bahwa Anda menggunakan variabel tabel, tabel temp akan digulirkan kembali.) Kemudian lakukan rollback, lalu masukkan data dari variabel tabel ke tabel logging.
Apa yang Anda miliki terlihat bagus untuk saya. Saya akan menyarankan melakukan sesuatu dengan informasi tentu saja setelah Anda memutar kembali transaksi misalnya menuliskannya ke log.
sumber