Nhóm kết nối gọi sp_resetconnection trước khi tái chế một kết nối. Đặt lại mức cô lập giao dịch không có trong danh sách những việc mà sp_resetconnection thực hiện. Điều đó sẽ giải thích tại sao "có thể tuần tự hóa" bị rò rỉ trên các kết nối được gộp chung.
Tôi đoán bạn có thể bắt đầu từng truy vấn bằng cách đảm bảo rằng nó ở mức cô lập phù hợp:
if not exists (
select *
from sys.dm_exec_sessions
where session_id = @@SPID
and transaction_isolation_level = 2
)
set transaction isolation level read committed
Một tùy chọn khác:các kết nối với một chuỗi kết nối khác không chia sẻ một nhóm kết nối. Vì vậy, nếu bạn sử dụng một chuỗi kết nối khác cho các truy vấn "có thể tuần tự hóa", chúng sẽ không chia sẻ một nhóm với các truy vấn "đã đọc cam kết". Một cách dễ dàng để thay đổi chuỗi kết nối là sử dụng thông tin đăng nhập khác. Bạn cũng có thể thêm một tùy chọn ngẫu nhiên như Persist Security Info=False;
.
Cuối cùng, bạn có thể đảm bảo rằng mọi truy vấn "có thể tuần tự hóa" sẽ đặt lại mức cô lập trước khi nó quay trở lại. Nếu không hoàn thành được truy vấn "serializable", bạn có thể xóa nhóm kết nối để buộc kết nối bị nhiễm bẩn ra khỏi nhóm:
SqlConnection.ClearPool(yourSqlConnection);
Điều này có thể tốn kém, nhưng các truy vấn không thành công là rất hiếm, vì vậy bạn không cần phải gọi ClearPool()
thường xuyên.