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.
quelle
Antworten:
In der Datenquelle eines SSRS-Berichts gibt es eine Eigenschaft für "Einzelne Transaktion bei der Verarbeitung der Abfragen verwenden". Es gibt verschiedene Verhaltensweisen, die mit dem Markieren dieses Kontrollkästchens verbunden sind:
1) Wie Sie bemerkt haben, verwendet SSRS eine explizite Transaktion, um die Datensätze unter Verwendung dieser Datenquelle zu verarbeiten, wenn dieses Kontrollkästchen aktiviert ist . Wenn es nicht markiert ist, gibt es keine explizite Transaktion.
2) Wenn dieses Kontrollkästchen nicht aktiviert ist , werden Datensätze, die die Datenquelle verwenden, parallel ausgeführt, wobei separate Verbindungen zum Server verwendet werden. Wenn das Kontrollkästchen aktiviert ist , verwenden die Datensätze eine einzelne Verbindung und werden seriell verarbeitet.
Darüber hinaus kann es unterschiedliche Gründe für die Verwendung dieses Kontrollkästchens geben. Die beiden wichtigsten sind:
1) Lesekonsistenz : Wenn Sie die Snapshot-Isolation verwenden , möchten Sie möglicherweise, dass alle Datensätze zu einem bestimmten Zeitpunkt konsistent sind. In diesem Fall kann durch die Verwendung einer einzelnen expliziten Transaktion und die Verwendung der Snapshot-Isolationsstufe sichergestellt werden, dass alle Anweisungen innerhalb der Transaktion zu einem bestimmten Zeitpunkt konsistent sind.
2) Leistung : Abhängig von einer Reihe von Faktoren (die eigentlich ein separates Thema sind) kann es zu dramatischen Leistungsunterschieden zwischen der parallelen Ausführung der Abfragen für verschiedene Datensätze und der seriellen Ausführung kommen.
quelle
In SSRS 2012 bin ich hier nicht auf dasselbe Verhalten gestoßen. Meine SPs wurden innerhalb von Transaktionen ausgeführt, obwohl das Kontrollkästchen nicht aktiviert war.
Das Aktivieren des Kontrollkästchens hatte keine Auswirkung auf die Anzahl der Transaktionen. In beiden Fällen war @@ TRANCOUNT = 1.
quelle