Folgendes berücksichtigen:
CREATE PROCEDURE dbo.usp_trantest AS
SELECT @@TRANCOUNT as trancount;
GO
Wenn ich usp_trantest
innerhalb von SSMS manuell aufrufe, ist der Trancount 0. Wenn ich einen SSRS-Bericht ausführe, der ein Dataset enthält, das dieselbe gespeicherte Prozedur abfragt, wird der Trancount als 1 protokolliert.
Wenn Sie eine T-SQL-Ablaufverfolgung der SSRS-Methode durchführen, wird ein Ablaufverfolgungsereignis für den Aufruf der gespeicherten Prozedur angezeigt, das mit dem Aufruf von SSMS identisch ist.
Gibt es ein Verhalten, das sich je nach SSRS-Kontext ändern kann? Wie eine implizite Transaktion, die für den dynamischen SQL-Aufruf oder etwas anderes geöffnet wird, oder SSRS, das einen Transaktionskontext außerhalb von T-SQL erstellt?
Bearbeiten:
In einer jetzt gelöschten Antwort von jemandem (danke, Fremder!) Wurde vorgeschlagen, dass im Datensatz des SSRS-Berichts möglicherweise die Option "Einzelne Transaktion bei der Verarbeitung der Abfragen verwenden" aktiviert war. Dies war tatsächlich der Fall!
Ich habe einige weitere Tests durchgeführt, und @@TRANCOUNT
wenn diese Einstellung deaktiviert ist, ist dies dieselbe, unabhängig davon, ob sie in SSMS oder in einem SSRS-Bericht ausgeführt wird.
Es scheint also, dass wir den Schluss ziehen können, dass diese Datenquelleneinstellung dazu führt, dass der SSRS-Bericht einen Transaktionskontext in der Datenbank erstellt, bevor die Abfragen ausgeführt werden. Da diese zusätzliche Transaktion nicht in der T-SQL-Ablaufverfolgung angezeigt wird, können wir wahrscheinlich davon ausgehen, dass sie mithilfe einer API-Methode anstelle einer T-SQL-Anweisung geöffnet wird.