トランザクションをロールバックしない場合でも、変更は行われますか?


10

クエリを実行しているとしましょう

begin tran

update users
set name = 'Jimmy'
where name = 'john'

トランザクションをロールバックしない場合でも、これらの変更は行われますか、それともエラーがスローされますか、それともロールバックとして機能しますか?


これは、これらのステートメントを実行するために使用するクライアントソフトウェアまたはそれらが埋め込まれているアプリケーションの動作に依存すると思います。構成されている場合、一部は自動コミットする場合があります(SSMSはデフォルトでそれを行います)。
mustaccio 2015

3
明示的に宣言されたトランザクションは自動コミットしません。Joshはトランザクションの開始を宣言しているため、Justin Caveが応答したとおりに動作します。
Dave

回答:


16

トランザクションとは何かを理解する必要があります。これは単一の作業単位です。ALLまたはNOTHING(ACIDプロパティに従います)であり、これによりデータベースの一貫性が保証されます。

トランザクションをロールバックしない場合でも、これらの変更は行われますか

変更はコミットした場合にのみ行われます。SQLサーバーはトランザクションログへのすべての変更を記録し、コミットすると、データファイルに変更されます。

コミットしない場合、トランザクションは無期限にOPENのままになります。これは、で確認sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactionsまたは使用できますDBCC OPENTRAN

また、開始したのは明示的なトランザクションであり、COMMITまたはROLLBACKステートメントで明示的に終了する必要があります。

またお読みください- 常にトランザクションを作成することは悪い習慣ですか?


@JoshStevenson データベースコンテキストでのアトミック操作について読んでいる間、価値があると思います。
Nelz

12

トランザクションをコミットもロールバックもしない場合、トランザクションは無期限に存在し続けます。a commitまたはa を介してトランザクションを終了するrollbackか、DBAがセッションを終了するまで(またはネットワーク障害などにより接続が失敗するまで)、ロックを保持し続け、他のセッションをブロックする可能性があります。DBAがセッションを強制終了すると、暗黙的に、このトランザクションおよびその他の開いているトランザクションに対してロールバックが発行されます。


これが正しい答えです。この情報がないと、COMMITステートメントとROLLBACKステートメントの両方を一緒に使用しても意味がありませんでした。
Tarec

1

変更はトランザクションがコミットされるまで行われません。トランザクションがコミットされない限り、上記の回答のすべてまたは何も答えられません。

原子性がこの背後にある理由です。データベースシステムが従う基本的なプロパティであるACIDトランザクションプロパティを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.