web-dev-qa-db-ja.com

データベース(SQL Serverなど)にトランザクションをコミットしないとどうなりますか?

クエリがあるとします:

begin tran
-- some other sql code

そして、コミットまたはロールバックするのを忘れます。

別のクライアントがクエリを実行しようとすると、どうなりますか?

95
Charbel

COMMITまたはROLLBACKトランザクションをしない限り、それはまだ「実行中」であり、ロックを保持している可能性があります。

クライアント(アプリケーションまたはユーザー)がコミットする前にデータベースへの接続を閉じると、まだ実行中のトランザクションはロールバックされて終了します。

129
marc_s

実際に自分でこれを試すことができます。これは、これがどのように機能するかを理解するのに役立ちます。

Management Studioで2つのウィンドウ(タブ)を開きます。各ウィンドウには、SQLへの独自の接続があります。

これで、1つのウィンドウでトランザクションを開始し、挿入/更新/削除などの操作を実行できますが、まだコミットすることはできません。次に、別のウィンドウで、トランザクションの外部からデータベースがどのように見えるかを確認できます。分離レベルによっては、最初のウィンドウがコミットされるまでテーブルがロックされたり、他のトランザクションがこれまでに何を行ったかを見ることができる場合があります(など)。

さまざまな分離レベルを試してみて、ロックヒントを使用せずに、結果にどのような影響があるかを確認します。

また、トランザクションでエラーをスローするとどうなるかを確認してください。

このすべてがどのように機能するかを理解することは非常に重要です。そうしないと、SQLの機能に何度も困惑することになります。

楽しんで! GJ。

33
gjvdkamp

トランザクションは、完全に実行するか、まったく実行しないことを目的としています。トランザクションを完了する唯一の方法はコミットすることであり、他の方法はすべてロールバックになります。

したがって、開始してからコミットしない場合、接続のクローズ時にロールバックされます(トランザクションが完了としてマークされずに中断されたため)。

14
Piskvor

着信トランザクションの分離レベルに依存します。

SQLトランザクション分離の説明

3
Xhalent

トランザクションを開くと、それ自体がロックされることはありません。ただし、そのトランザクション内でいくつかのクエリを実行すると、分離レベルに応じて、一部の行、テーブル、またはページがロックされるため、他のトランザクションからアクセスしようとする他のクエリに影響します。

2
red.clover

トランザクションの例

トラントットを開始

SQLステートメント

エラーが発生した場合は、ロールバックトランTTその他コミットトランTT

Commit tran ttを実行していない限り、データは変更されません

1
user3386471

潜在的なロックの問題に加えて、アクティブなトランザクションの最小LSNを超えて切り捨てられないため、トランザクションログが大きくなり始めることがあります。スナップショット分離を使用している場合、tempdbのバージョンストアは大きくなります同様の理由。

dbcc opentranを使用して、最も古いオープントランザクションの詳細を表示できます。

0
Martin Smith

コミットされていないトランザクションはサーバーをロックしたままにし、他のクエリはサーバー上で実行されません。トランザクションをロールバックするか、コミットする必要があります。 SSMSを閉じると、トランザクションが終了し、他のクエリを実行できるようになります。

0
Josh Stunner