Nó có thể vẫn mở trong khi áp dụng gộp kết nối. Ví dụ:thời gian chờ lệnh có thể để lại khóa và TXN vì ứng dụng khách gửi dưới dạng "hủy bỏ".
2 giải pháp:
-
Kiểm tra trong ứng dụng khách, nghĩa đen:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
Sử dụng
SET XACT_ABORT ON
để đảm bảo một TXN được làm sạch:Câu hỏi 1 và Câu hỏi 2
Tôi luôn sử dụng SET XACT_ABORT ON
.
Từ blog của Nhóm SQL này:
Lưu ý rằng với tính năng gộp kết nối, chỉ cần đóng kết nối mà không khôi phục lại kết nối sẽ chỉ trả lại kết nối về nhóm và giao dịch sẽ vẫn mở cho đến khi được sử dụng lại hoặc bị xóa khỏi nhóm.
Từ MSDN, phần "Hỗ trợ giao dịch" (chữ in đậm của tôi)
Khi một kết nối bị đóng, nó sẽ được đưa trở lại vào nhóm và đưa vào bối cảnh giao dịch dựa trên phân khu thích hợp. Do đó, bạn có thể đóng kết nối mà không tạo ra lỗi, ngay cả khi giao dịch được phân bổ vẫn đang tiếp tục. Điều này cho phép bạn xác nhận giao dịch được phân phối tại thời điểm khác nhau.