Itu bisa tetap terbuka saat penyatuan koneksi berlaku. Contoh:batas waktu perintah dapat meninggalkan kunci dan TXN karena klien mengirim sebagai "abort".
2 solusi:
-
Uji di klien, secara harfiah:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
Gunakan
SET XACT_ABORT ON
untuk memastikan TXN dibersihkan:Pertanyaan 1 dan Pertanyaan 2
Saya selalu menggunakan SET XACT_ABORT ON
.
Dari blog Tim SQL ini:
Perhatikan bahwa dengan connection pooling, hanya dengan menutup koneksi tanpa rollback hanya akan mengembalikan koneksi ke pool dan transaksi akan tetap terbuka sampai kemudian digunakan kembali atau dihapus dari pool. Hal ini dapat mengakibatkan lock mulai tidak diperlukan dan menyebabkan timeout dan rolling block lainnya.
Dari MSDN, bagian "Dukungan Transaksi" (tebal saya)
Ketika koneksi ditutup, itu dilepaskan kembali ke pool dan ke dalam subdivisi yang sesuai berdasarkan konteks transaksinya. Oleh karena itu, Anda dapat menutup koneksi tanpa membuat kesalahan, meskipun transaksi terdistribusi masih tertunda. Ini memungkinkan Anda untuk melakukan atau membatalkan transaksi terdistribusi pada waktu alater.