分離レベル


分離レベル 同時実行制御のメカニズムとしてロックを使用すると、同時実行の問題を解決で きます。つまり、複数のトランザクションが存在している場合でも、互いに完全に 分離したトランザクションとして同時に実行できます。

直列化可能性とは、一連の同時トランザクションを実行して実現されるデータベ ースの状態が、一連のトランザクションをある順序で直列に実行することによって 実現されるデータベースの状態と等しくなる可能性のことです。

SQL-92 分離レベル 直列化は、トランザクションがデータベース内のデータを正しい状態で保持する ために重要です。ただし、多くのトランザクションにいつも完全な分離が必要とい うわけではありません。たとえば、本の各章を数人の執筆者で分担するとします。 新しい章はプロジェクトにいつでも提出できます。ただし、章の編集後は、編集者 の承認なく執筆者が変更することはできません。このようにすると、未編集の新し い章が追加されても、編集者はどの時点でもプロジェクトを正しい状態で保持でき ます。編集者は以前に編集された章と最近新しく追加された章を把握できます。

トランザクションが一貫性のないデータを受け入れ可能であるレベルを、分離レ ベルと呼んでいます。分離レベルは、トランザクションどうしを分離する度合いと も言えます。分離レベルが低い場合は、同時実行性が増加します。ただし、データ の精度は損なわれます。これに対し、分離レベルが高い場合は、データの精度は高 くなります。ただし、同時実行性は低下します。アプリケーションに必要な分離レ ベルによって、SQL Server で使用されるロック動作が決定されます。

SQL-92 では次の分離レベルが定義されており、すべて SQL Server でサポートさ れています。

非コミット読み取り (物理的に壊れたデータが読めないということだけを認識で きる最も低い分離レベル)

コミット済み読み取り (SQL Server の既定の分離レベル)

REPEATABLE READ

直列化 (各トランザクションが完全に分離される最高の分離レベル) トランザクションを直列化の分離レベルで実行する場合、重複している同時実行 ト ランザクションは順に実行されます。

以下の分離レベルでは動作内容が異なります。

分離レベル ダーティ リード 反復不可能読み取り ファントム READ UNCOMMITTED 可 可 可 READ COMMITTED 不可 可 可 REPEATABLE READ 不可 不可 可 SERIALIZABLE 不可 不可 不可

2 つのトランザクションが同じ行を取得しようとして更新が失われてしまうのを 防ぐために、トランザクションは REPEATABLE READ またはそれ以上のレベルで実行 される必要があります。そうでないと、同じ行を獲得しようとした結果、前者の変 更を取り消して後者が変更前に取得した行に変更を加えてしまうことがあります。2 つのトランザクションが 単一の UPDATE ステートメントを使用して行を変更して おり、その変更が先に取得した値に基づいていない場合、既定の分離レベル READ COMMITTED では更新が失われることはありません。


リレーショナル データへのアクセスおよびデータの変更

同時実行の問題 ロックを使用していない場合に複数のユーザーが同時にデータベースにアクセス すると、次の問題が発生する場合があります。以下の同時実行の問題が発生します 。

更新データ損失

非コミット依存 (ダーティ リード)

不一致分析 (反復不能読み取り)

ファントム読み取り 更新データ損失 この問題は、複数のトランザクションが同じ行を選択し、その行の元の値を更新 すると発生します。トランザクションは互いに相手を意識することがありません。 更新によってほかのトランザクションによる更新データが上書きされれば、そのデ ータが失われてしまいます。

たとえば、2 人の編集者が同じ文書のコピーを作成したとします。2 人が自分の コピーを変更し、その変更内容を保存して、元の文書を上書きしたとします。最初 に保存した編集者のコピーは、後から保存した編集者のコピーによって上書きされ ます。最初の編集者の作業が終わるまでほかの編集者が変更できないようにすれば 、この問題を防ぐことができます。

非コミット依存 (ダーティ リード) 非コミット依存は、トランザクションによって更新中の行を別のトランザクショ ンが選択するときに発生します。2 番目のトランザクションが読み取るデータは、 まだコミットされていないので、行を更新中のトランザクションによって変更され る可能性があります。

たとえば、ある編集者が電子文書を変更しているとします。その間、ほかの編集 者はそれまでの変更が反映された文書を受け取って、読者に配布します。その後、 最初の編集者がそれまでの変更を誤りと判断して取り消し、保存したとします。配 布されている文書には取り消した編集内容が含まれているため、既に存在しない文 書として扱う必要があります。最初の編集者が最終的な変更を終了するまで読者が 読めないようにすれば、この問題を防ぐことができます。

不一致分析 (反復不能読み取り) 不一致分析は、別のトランザクションが同じ行に数回アクセスし、それぞれの場 合で異なったデータを読み取るときに発生します。不一致分析は、トランザクショ ンがデータを変更中に別のトランザクションがそのデータを読み取るという点で非 コミット依存と似ています。ただし不一致分析の場合、別のトランザクションが読 み取るデータは変更を行ったトランザクションによってコミットされています。ま た、同じ行が複数回読み取られ、そのたびにトランザクションによって情報が変 更されます。そのため、反復不能読み取りと呼ばれます。

たとえば、編集者が同じ文書を 2 回読む場合に、1 回目と 2 回目の間に執筆者 が文書を変更したとします。編集者が 2 回目に文書を読んだときには、内容が大幅 に変更されています。最初に読んだ内容と同じものが繰り返し読み取られるわけで はありません。文書の執筆が完全に終了してから編集者が読むようにすれば、この 問題を防ぐことができます。

ファントム読み取り (ファントム) ファントム読み取りは、トランザクションによって読み取られる一連の行のどれ かについて挿入または削除が行われるときに発生します。別のトランザクションで 削除が行われた場合、2 回目以降の読み取りでは、一連の行に対する最初の読み取 りで得られた行のデータが得られなくなります。別のトランザクションで挿入が行 われた場合、2 回目以降の読み取りでは、一連の行に対する最初の読み取りで得ら れなかった行のデータが読み取られます。

たとえば、執筆者から受け取った文書を編集者が編集するとします。制作部門が 編集内容を文書のマスタ コピーに反映しているときに、新しい未編集のデータが執 筆者によって追加されたとします。編集者および制作部門が元の文書の編集を終了 するまでその文書に新しいデータを追加できないようにすれば、この問題を防ぐこ とができます。