Hãy xem xét những điều sau đây:
CREATE PROCEDURE dbo.usp_trantest AS
SELECT @@TRANCOUNT as trancount;
GO
Khi tôi gọi usp_trantest
thủ công từ bên trong SSMS, trancount là 0. Nếu tôi chạy báo cáo SSRS có chứa một tập dữ liệu truy vấn cùng một thủ tục được lưu trữ, thì trancount được ghi là 1.
Thực hiện theo dõi T-SQL của phương thức SSRS cho thấy một sự kiện theo dõi cho lệnh gọi thủ tục được lưu trữ giống hệt với lệnh tôi đã thực hiện từ SSMS.
Có một số hành vi có thể thay đổi dựa trên bối cảnh SSRS không? Giống như, một giao dịch ngầm được mở cho cuộc gọi sql động hoặc một cái gì đó, hoặc SSRS tạo bối cảnh giao dịch bên ngoài T-SQL?
Biên tập:
Trong câu trả lời đã bị xóa từ một người nào đó (cảm ơn, người lạ!) Đã đề xuất rằng bộ dữ liệu của báo cáo SSRS có thể đã "Sử dụng giao dịch đơn lẻ khi xử lý các truy vấn" được chọn. Đây quả nhiên là một trường hợp đấy!
Tôi đã thực hiện một số thử nghiệm tiếp theo và với cài đặt này không được kiểm tra, @@TRANCOUNT
điều tương tự cho dù đang chạy trong SSMS hay từ báo cáo SSRS.
Vì vậy, có vẻ như chúng ta có thể rút ra kết luận rằng cài đặt Nguồn dữ liệu này khiến báo cáo SSRS tạo bối cảnh giao dịch trên cơ sở dữ liệu trước khi chạy các truy vấn. Vì giao dịch bổ sung này không xuất hiện trong theo dõi T-SQL, nên chúng tôi có thể giả định rằng nó đang được mở bằng phương thức API, thay vì câu lệnh T-SQL.