web-dev-qa-db-ja.com

暗黙的なトランザクションは、SQL Serverのバッチごとまたはセッションごとですか?

GOコマンドで区切られた複数のバッチをManagement Studioで実行していると想像してください。暗黙的なトランザクションがどのように動作するかを知りたい-トランザクションはバッチごとにコミットされるか、実行全体で1回コミットされるか。

4
Neil P

「暗黙のトランザクション」とは正確にはどういう意味ですか? IMPLICIT_TRANSACTIONS のセッションプロパティが有効になっていて、その機能を使用しているということですか?それとも、BEGIN TRANSACTIONを指定していないということですか? (つまり、「明示的な」トランザクションを作成する)?

IMPLICIT_TRANSACTIONS機能を意味している場合は、単にBEGIN TRANのみを発行し、それ以上は発行しません。したがって、IMPLICIT_TRANSACTIONSを使用してBEGIN TRANを発行するかどうか、または明示的に自分で発行する場合でも、COMMITまたはROLLBACKを発行する必要があります。そして、はい、トランザクションをバッチにまたがることができます。GOを使用してバッチを分離する場合も、異なる時間にF5を押して複数のクエリを実行する場合も同様です。

どちらの場合でも、IMPLICIT_TRANSACTIONSONに設定するか、明示的なBEGIN TRANステートメントを使用すると、自動的にコミットされるものはありません。これらの2つの場合に自動的になる可能性があるのは、最初にROLLBACKまたはCOMMITを発行せずに接続を閉じる場合のROLLBACKだけです。

IMPLICIT_TRANSACTIONSONに設定するか、明示的なBEGIN TRANステートメントを使用しない場合、個々のクエリは独自のトランザクションであり、「自動コミット」されるため、心配する必要はありません。つまり、2つの別個のINSERTステートメントは、2つの完全に別個のトランザクションです。

6
Solomon Rutzky

暗黙的なトランザクション(チェーントランザクションモード)はバッチにまたがります。 goコマンドは、トランザクションのステータスには影響しません。

バッチにまたがる(つまり、goコマンドにまたがる)トランザクションを含むいくつかの例については、 SET IMPLICIT_TRANSACTIONS を参照してください。

4
markp-fuso

どちらでもない。それらはSQL標準に従ってステートメントごとです。

つまり、たとえばループで実行されるバッチは1つのトランザクションでは実行されませんが、すべてのステートメントは独自のアトミックトランザクションです。

1
TomTom