Was ist mit Transaktionen in einer gespeicherten Prozedur, die von einem SSRS-Bericht aufgerufen wird?

7

Folgendes berücksichtigen:

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

Wenn ich usp_trantestinnerhalb 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 @@TRANCOUNTwenn 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.

NReilingh
quelle
1
Jemand hat eine Antwort gelöscht (nicht sicher warum) und gefragt, ob in der Datenquelle für meinen SSRS-Bericht "Alle Abfragen innerhalb einer einzelnen Transaktion ausführen" aktiviert sein könnte. Daran hatte ich nicht gedacht, und ich bin mir ziemlich sicher, dass es so ist! Dies könnte darauf hindeuten, dass SSRS eine Transaktion auf API-Ebene erstellt, die im T-SQL-Trace nicht sichtbar ist, aber ich habe dies noch nicht getestet. Ich denke, es ist auch möglich, dass SSRS dies für jede Abfrage tun würde, selbst wenn diese Datenquelleneinstellung nicht aktiviert wäre , aber das hilft nicht, die Frage zu beantworten.
NReilingh
Bitte aktualisieren Sie die Frage / den Kommentar nach dem Test.
Stoleg

Antworten:

2

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.

Zwei
quelle
0

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.

Dan
quelle
Sind Sie sicher, dass der Bericht die Abfrage tatsächlich erneut ausgeführt hat? Dies klingt so, als hätte SSRS zwischengespeicherte Ergebnisse wiederverwendet, was in VS passieren kann. Mein Test war auch am 2012.
NReilingh
Nach weiteren Analysen glaube ich, dass das Infor-ERP, das den SSRS-Bericht aufrief, den Sp entführte, um einige seiner eigenen Einstellungen vorzunehmen. Meine Ergebnisse sind also wahrscheinlich ungültig.
Dan