「更新の損失」を回避するための最小トランザクション分離レベル 質問する

「更新の損失」を回避するための最小トランザクション分離レベル 質問する

SQL Server のトランザクション分離レベルを使用すると、ダーティ リードなどの特定の望ましくない同時実行の問題を回避できます。

私が今興味を持っているのは更新が失われました- 誰にも気付かれずに、2 つのトランザクションが互いの更新を上書きできるという事実。これを回避するには、最低限どの分離レベルを選択する必要があるかについて、矛盾する意見を見聞きします。

Kalen Delaney は著書「SQL Server Internals」の中で次のように述べています (第 10 章 - トランザクションと同時実行 - 592 ページ)。

Read Uncommitted分離では、前述のすべての動作が、失われた更新を除く、が可能です。

一方、クラスを担当している独立した SQL Server トレーナーは、更新の損失を回避するには少なくとも「繰り返し読み取り」が必要であると教えてくれました。

それで、誰が正しいのでしょうか?? そして、なぜでしょうか??

ベストアンサー1

回答するには遅すぎるかどうかはわかりませんが、私は大学でトランザクション分離レベルについて学んでいるところで、調査の一環として次のリンクを見つけました。

マイクロソフト テックネット

具体的には、問題となっている段落は次のとおりです。

更新が失われました

更新の損失は、2 つの方法のいずれかで解釈できます。最初のシナリオでは、最初のトランザクションがコミットまたはロールバックされる前に、あるトランザクションによって更新されたデータが別のトランザクションによって上書きされたときに、更新の損失が発生したと見なされます。 このタイプの更新の損失は、どのトランザクション分離レベルでも許可されていないため、SQL Server 2005 では発生しません。

失われた更新のもう 1 つの解釈は、1 つのトランザクション (トランザクション #1) がデータをローカル メモリに読み込み、次に別のトランザクション (トランザクション #2) がこのデータを変更して変更をコミットする場合です。その後、トランザクション #1 は、トランザクション #2 が実行される前にメモリに読み込んだ内容に基づいて同じデータを更新します。この場合、トランザクション #2 によって実行された更新は失われた更新と見なすことができます。

つまり、本質的には両者とも正しいのです。

個人的には(間違っている可能性もありますが、まだ勉強中なので訂正してください)、このことから次の 2 つの点を指摘します。

  1. トランザクション環境の全体的な目的は、最初の段落で説明したように、更新の損失を防ぐことです。したがって、最も基本的なトランザクション レベルでさえそれができないのであれば、なぜそれを使用するのでしょうか。

  2. 失われた更新について話すとき、最初の段落が当てはまることはわかっているので、一般的には 2 番目の種類の失われた更新を意味します。

繰り返しになりますが、私もこれを理解したいので、何か間違っている点があれば訂正してください。

おすすめ記事