Kumpulan koneksi memanggil sp_resetconnection sebelum mendaur ulang koneksi. Menyetel ulang tingkat isolasi transaksi tidak ada dalam daftar hal-hal yang dilakukan sp_resetconnection. Itu akan menjelaskan mengapa kebocoran "serializable" di seluruh koneksi gabungan.
Saya rasa Anda dapat memulai setiap kueri dengan memastikannya pada tingkat isolasi yang tepat:
if not exists (
select *
from sys.dm_exec_sessions
where session_id = @@SPID
and transaction_isolation_level = 2
)
set transaction isolation level read committed
Opsi lain:koneksi dengan string koneksi yang berbeda tidak berbagi kumpulan koneksi. Jadi, jika Anda menggunakan string koneksi lain untuk kueri "dapat dibuat serial", mereka tidak akan berbagi kumpulan dengan kueri "komit baca". Cara mudah untuk mengubah string koneksi adalah dengan menggunakan login yang berbeda. Anda juga dapat menambahkan opsi acak seperti Persist Security Info=False;
.
Terakhir, Anda dapat memastikan setiap kueri "yang dapat dibuat serial" menyetel ulang tingkat isolasi sebelum kembali. Jika kueri "serializable" gagal diselesaikan, Anda dapat menghapus kumpulan koneksi untuk memaksa koneksi yang tercemar keluar dari kumpulan:
SqlConnection.ClearPool(yourSqlConnection);
Ini berpotensi mahal, tetapi kueri yang gagal jarang terjadi, jadi Anda tidak perlu memanggil ClearPool()
sering.