Sql-Server-2012

SSRS 報告呼叫的儲存過程中的事務處理是什麼?

  • June 25, 2018

考慮以下:

CREATE PROCEDURE dbo.usp_trantest AS
SELECT @@TRANCOUNT as trancount;
GO

當我usp_trantest從 SSMS 中手動呼叫時,轉數為 0。如果我執行包含查詢相同儲存過程的數據集的 SSRS 報告,則轉數記錄為 1。

對 SSRS 方法進行 T-SQL 跟踪會顯示儲存過程呼叫的跟踪事件,這與我在 SSMS 中所做的相同。

是否有一些行為可能會根據 SSRS 上下文而改變?比如,為動態 sql 呼叫或其他東西打開了一個隱式事務,或者 SSRS 在 T-SQL 之外創建了一個事務上下文?

編輯:

在某人現在已刪除的答案中(謝謝,陌生人!)有人建議 SSRS 報告的數據集可能已選中“處理查詢時使用單個事務”。確實是這樣!

我做了一些進一步的測試,並且在未選中此設置的@@TRANCOUNT情況下,無論是在 SSMS 中執行還是從 SSRS 報告中執行,都是相同的。

因此,我們似乎可以得出這樣的結論:此數據源設置確實會導致 SSRS 報告在執行查詢之前在數據庫上創建事務上下文。由於這個額外的事務沒有出現在 T-SQL 跟踪中,我們可以假設它是使用 API 方法打開的,而不是 T-SQL 語句。

在 SSRS 報告的數據源上,有一個“處理查詢時使用單個事務”的屬性。標記此復選框有幾種不同的行為:

  1. 如您所見,如果選中此復選框,SSRS 將使用顯式事務處理使用此數據源的數據標記時,沒有顯式事務。

  2. 如果選中此復選框,則使用數據源的數據集將並行執行,使用與伺服器的單獨連接。如果勾選了複選框,數據集使用單個連接並按順序處理。

此外,使用此復選框可能有不同的動機。主要的兩個是:

1)讀取一致性:如果您使用Snapshot Isolation,您可能希望所有數據集與單個時間點保持一致。在這種情況下,使用單個顯式事務並使用 Snapshot 隔離級別可以確保事務中的所有語句與單個時間點保持一致。

2)性能:取決於許多因素(這實際上是一個單獨的主題),您可能會看到並行執行不同數據集的查詢與串列執行它們之間的巨大性能差異。

引用自:https://dba.stackexchange.com/questions/130948