sqlserver ストアドプロシージャ トランザクション




SQL Serverは、トランザクションに関してストアドプロシージャ内のステートメントをどのように扱いますか? (2)

SELECT、INSERT、UPDATE、DELETEの各ステートメントからなるストアドプロシージャがあるとします。 明示的なBEGIN TRANS / COMMIT TRANS / ROLLBACK TRANSロジックはありません。

SQL Serverはこのストアドプロシージャをトランザクション上どのように処理しますか? 各文に暗黙的な接続がありますか? または、ストアドプロシージャのトランザクションが1つありますか?

また、T-SQLやSQL Server Management Studioを使用して私自身がこれをどのように見つけ出すことができましたか?

ありがとう!


1つの接続しかありません。ストアドプロシージャ内のSQLコマンドの数に関係なく、プロシージャを実行するために使用されます。

ストアドプロシージャに明示的なBEGIN TRANSACTIONがないため、各ステートメントは単独で実行され、エラーがあれば変更をロールバックする機能はありません。

ただし、BEGIN TRANSACTIONを発行するストアド・プロシージャをコールする前に、すべての文がトランザクション内でグループ化され、ストアド・プロシージャの実行後にCOMMITまたはROLLBACKすることができます。

ストアドプロシージャ内から、システム変数@@ TRANCOUNT(Transact-SQL)の値をチェックして、トランザクション内で実行しているかどうかを判断できます。 ゼロはトランザクションが存在しないことを意味し、何も入れ子になっているトランザクションのネストレベルを表示します。SQL Serverのバージョンによっては、 XACT_STATE(Transact-SQL)も使用できます。

次の操作を行う場合:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

プロシージャ内のすべてがトランザクションによってカバーされ、すべての6つのステートメント(EXECはトランザクションによってカバーされるステートメント、1 + 5 = 6)です。 これを行う場合:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1
EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

2つのプロシージャコール内のすべてがトランザクションによってカバーされ、すべての12のステートメント(2つのEXECは両方ともトランザクションによってカバーされます.1 + 5 + 1 + 5 = 12)。


簡単なことを行う小さなストアドプロシージャを作成して、テストテーブルにレコードを挿入するなど、独自の方法で見つけることができます。 それからTranを始める。 sp_testを実行します。 ロールバック。 そこに新しいレコードがありますか? そうであれば、SPは外部トランザクションを無視する。 そうでない場合、SPはトランザクション内で実行される別のステートメントです(これはかなり確信しています)。





transactions