以下を検討してください。
CREATE PROCEDURE dbo.usp_trantest AS
SELECT @@TRANCOUNT as trancount;
GO
SSMS内からusp_trantest
を手動で呼び出すと、trancountは0になります。同じストアドプロシージャをクエリするデータセットを含むSSRSレポートを実行すると、trancountは1として記録されます。
SSRSメソッドのT-SQLトレースを実行すると、SSMSから実行したものと同じストアドプロシージャコールのトレースイベントが表示されます。
SSRSコンテキストに基づいて変化する可能性のある動作はありますか?動的SQL呼び出しなどのために暗黙的なトランザクションが開かれているのか、SSRSがT-SQLの外部でトランザクションコンテキストを作成しているのか?
誰かからの削除された回答(ありがとう、見知らぬ人!)では、SSRSレポートのデータセットで[クエリの処理時に単一のトランザクションを使用する]がオンになっている可能性があることが示唆されました。これは確かにそうでした!
さらにテストを行ったところ、この設定をオフにした場合、@@TRANCOUNT
は、SSMSで実行してもSSRSレポートから実行しても同じです。
したがって、このデータソース設定により、クエリを実行する前にSSRSレポートがデータベース上にトランザクションコンテキストを作成するという結論を導くことができるようです。この余分なトランザクションはT-SQLトレースに表示されないため、T-SQLステートメントではなくAPIメソッドを使用して開かれていると考えられます。
SSRSレポートのデータソースには、「クエリの処理時に単一のトランザクションを使用する」というプロパティがあります。このチェックボックスをマークすることに関連付けられたいくつかの異なる動作があります:
1)お気付きのとおり、このチェックボックスisがマークされている場合、SSRSは明示的なトランザクションを使用して、このデータソースを使用するデータセットを処理します。 notとマークされている場合、明示的なトランザクションはありません。
2)このチェックボックスがnotとマークされている場合、データソースを使用するデータセットは、サーバーへの個別の接続を使用して並列に実行されます。チェックボックスisがマークされている場合、データセットは単一の接続を使用し、順次処理されます。
また、このチェックボックスを使用する動機はさまざまです。 2つの主要なものは次のとおりです。
1)読み取りの一貫性: Snapshot Isolation を使用している場合、すべてのデータセットを1つのポイントに一貫させる必要があります時間内に。この場合、単一の明示的なトランザクションを使用し、スナップショット分離レベルを使用すると、トランザクション内のすべてのステートメントが単一の時点に一貫していることを確認できます。
2)パフォーマンス:多くの要因(実際には別のトピックです)に応じて、異なるデータに対してクエリを実行するとパフォーマンスが劇的に異なる場合がありますセットを並列に実行するか、順次実行するか。
SSRS 2012では、ここに示されている同じ動作は発生しませんでした。チェックボックスがオンになっていないにもかかわらず、SPはトランザクション内で実行されました。
チェックボックスをオンにしても、トランザクション数には影響しませんでした。どちらの場合も、@@ TRANCOUNTは= 1でした。