GOコマンドで区切られた複数のバッチをManagement Studioで実行していると想像してください。暗黙的なトランザクションがどのように動作するかを知りたい-トランザクションはバッチごとにコミットされるか、実行全体で1回コミットされるか。
「暗黙のトランザクション」とは正確にはどういう意味ですか? IMPLICIT_TRANSACTIONS のセッションプロパティが有効になっていて、その機能を使用しているということですか?それとも、BEGIN TRANSACTION
を指定していないということですか? (つまり、「明示的な」トランザクションを作成する)?
IMPLICIT_TRANSACTIONS
機能を意味している場合は、単にBEGIN TRAN
のみを発行し、それ以上は発行しません。したがって、IMPLICIT_TRANSACTIONS
を使用してBEGIN TRAN
を発行するかどうか、または明示的に自分で発行する場合でも、COMMIT
またはROLLBACK
を発行する必要があります。そして、はい、トランザクションをバッチにまたがることができます。GO
を使用してバッチを分離する場合も、異なる時間にF5
を押して複数のクエリを実行する場合も同様です。
どちらの場合でも、IMPLICIT_TRANSACTIONS
をON
に設定するか、明示的なBEGIN TRAN
ステートメントを使用すると、自動的にコミットされるものはありません。これらの2つの場合に自動的になる可能性があるのは、最初にROLLBACK
またはCOMMIT
を発行せずに接続を閉じる場合のROLLBACK
だけです。
IMPLICIT_TRANSACTIONS
をON
に設定するか、明示的なBEGIN TRAN
ステートメントを使用しない場合、個々のクエリは独自のトランザクションであり、「自動コミット」されるため、心配する必要はありません。つまり、2つの別個のINSERT
ステートメントは、2つの完全に別個のトランザクションです。
暗黙的なトランザクション(チェーントランザクションモード)はバッチにまたがります。 go
コマンドは、トランザクションのステータスには影響しません。
バッチにまたがる(つまり、go
コマンドにまたがる)トランザクションを含むいくつかの例については、 SET IMPLICIT_TRANSACTIONS を参照してください。
どちらでもない。それらはSQL標準に従ってステートメントごとです。
つまり、たとえばループで実行されるバッチは1つのトランザクションでは実行されませんが、すべてのステートメントは独自のアトミックトランザクションです。