web-dev-qa-db-ja.com

トランザクション内のSELECTステートメントとトランザクション外のSELECTステートメントに違いはありますか

デフォルトのREAD COMMITTED分離レベルでは、selectステートメントの動作がトランザクション内とトランザクション内では異なるものになっていますか?

MSSQLを使用しています。

40
Omu

はい、トランザクション内のものは、thatトランザクション内の他の以前のInsert/Update/deleteステートメントによって行われた変更を確認できます。トランザクション外のSelectステートメントはできません。

あなたが尋ねているすべてが分離レベルが何であるかであるならば、すべての選択ステートメント(ちょっと、すべての種類のすべてのステートメント)-トランザクションで。明示的にトランザクション内にあるものとそれ自体で立っているものとの唯一の違いは、スタンドアロンであるものは、それを実行する直前にトランザクションを開始し、実行した直後にコミットまたはロールバックすることです。

一方、トランザクションでexplicitlyとなるもの(Begin Transactionステートメントがあるため)は、同じトランザクション内で他のステートメント(挿入/更新/削除など)を発生させることができます。そのSelectステートメントの前または後。

したがって、分離レベルの設定が何であれ、両方の選択(明示的なトランザクションの内部または外部)は、それにもかかわらず、その分離レベルで動作しているトランザクションになります。

Addition:以下はSQL Server用ですが、すべてのデータベースが同じように動作する必要があります。 SQL Serverでは、クエリプロセッサは常に3つのトランザクションモードAutoCommitImplicit、または明示的

  • AutoCommit は、SQL Serverデータベースエンジンのデフォルトのトランザクション管理モードです。 ..すべてのTransact-SQLステートメントは、完了時にコミットまたはロールバックされます。 ...ステートメントが正常に完了すると、コミットされます。エラーが発生した場合は、ロールバックされます。これはデフォルトであり、コメント内の@Alexの質問に対する回答です。

  • Implicit Transaction モードでは、「... SQL Serverデータベースエンジンは、現在のトランザクションがコミットまたはロールバックされた後、自動的に新しいトランザクションを開始します。トランザクションの開始を表すものは何もありません。各トランザクションをコミットまたはロールバックするだけです。暗黙的なトランザクションモードでは、トランザクションの連続的なチェーンが生成されます。.. "斜体のスニペットは、単一のステートメントでも複数のステートメントでもトランザクション。

  • BEGIN TRANSACTIONステートメントでトランザクションを明示的に開始すると、エンジンは Explicit Transaction モードになります。次に、明示的にトランザクションを終了するまで(COMMITまたはROLLBACKを使用)、またはエンジンが終了してロールバックする原因となる障害が発生するまで、すべてのステートメントがそのトランザクション内で実行されます。

64
Charles Bretana

はい、少し違いがあります。 MySQLの場合、データベースは最初のクエリまで実際にはスナップショットから始まりません。したがって、重要なのは始まりではなく、トランザクション内の最初のステートメントです。次の場合:

#Session 1
begin; select * from table;

#Session 2
delete * from table; #implicit autocommit

#Session 1
select * from table;

次に、セッションで同じものを両方取得します(削除する前にテーブルにあった情報)。セッション1のトランザクション(コミット、開始、またはロールバック)を終了し、そのセッションから再度チェックすると、テーブルが空として表示されます。

7
Jeff Ferland

データベース(またはmysqlでは、selectステートメントで使用されるすべてのテーブルの基盤となるストレージエンジン)がトランザクションである場合、「トランザクションの外部」でそれを実行する方法はありません。

おそらく「自動コミットモードで実行する」ことを意味しているかもしれませんが、それは「非トランザクション」と同じではありません。後者の場合、トランザクションで実行されますが、ステートメントが終了した直後にトランザクションが終了するだけです。

したがって、どちらの場合も、実行中に、1つの選択ステートメントが他のトランザクションからREAD COMMITTEDレベルで分離されます。

これがREAD COMMITTEDトランザクション分離レベルで何を意味するかを考えてみましょう。おそらく驚くほど、それほどではありません。

READ COMMITTEDは、反復不能な読み取りが発生する可能性があることを意味します。同じトランザクションで複数のselectステートメントを実行すると、特定の時点で選択した行が変更され、別のトランザクションによってコミットされる可能性があります。後で同じ保留中のトランザクションでselectステートメントを再実行すると、これらの変更を確認できます。自動コミットモードでは、これらの2つのselectステートメントは独自のトランザクションで実行されます。最初に選択した行を別のトランザクションが変更してコミットした場合、2回目にステートメントを実行したときにも、それらの変更を確認できます。

3
Roland Bouman

READ COMMITTED分離レベルは、書き込まれたレコードに関するものです。このselectステートメントがトランザクション内にあるかどうかとは関係ありません(同じトランザクション中に書き込まれたものを除く)。

2
Gabriel McAdams