#トランザクション分離レベル
データベース操作では、同時に読み取られるデータの正確性を効果的に保証するために、提案されたトランザクション分離レベル。 推奨事項: "mysql チュートリアル"
質問提起
データベースは顧客によって共有され、アクセスされる必要があります。データベースの運用中には、次のような不確実な状況が発生する可能性があります。 更新が失われました両方のトランザクションが同時にデータ行を更新し、一方のトランザクションによるデータの更新が、もう一方のトランザクションによるデータの更新を上書きします。これは、システムがロック操作を実行しないため、同時トランザクションが分離されないためです。 ダーティ リードトランザクションは、別のトランザクションのコミットされていないデータ操作の結果を読み取ります。すべての操作がロールバックされる可能性があるため、これは非常に危険です。 反復不可能な読み取り反復不可能な読み取り: トランザクションは同じデータ行を 2 回読み取りますが、異なる結果が得られます。次の状況が含まれます。
(1) 仮想読み取り: トランザクション T1 が特定のデータを読み取った後、トランザクション T2 がそのデータを変更し、トランザクション T1 が再度それを読み取ると、このデータ前回とは異なる値が得られます。 (2) ファントム読み取り: トランザクションは操作中に 2 つのクエリを実行します。2 番目のクエリの結果には、最初のクエリに現れなかったデータ、または最初のクエリに欠落しているデータが含まれています。( に表示されるデータ) 2 つのクエリの SQL ステートメントが同じである必要はありません)。これは、2 つのクエリ中に別のトランザクションがデータを挿入したことが原因で発生します。解決策
上記の状況を回避するために、標準 SQL 仕様では 4 つのトランザクション分離レベルが定義されており、分離レベルが異なるとトランザクションに与える影響も異なります。異なります。 不正な読み取りRead Uncommitted とも呼ばれます: ダーティ リードは許可されますが、失われた更新は許可されません。トランザクションがデータの書き込みを開始した場合、別のトランザクションが同時に書き込むことはできませんが、他のトランザクションはこのデータ行を読み取ることができます。この分離レベルは、「排他的書き込みロック」によって実現できます。 Authorized ReadRead Committed とも呼ばれます: 反復不可能な読み取りは許可されますが、ダーティ リードは許可されません。これは、「一時的な共有読み取りロック」と「排他的書き込みロック」によって実現できます。データを読み取るトランザクションにより、他のトランザクションは引き続きデータ行にアクセスできますが、コミットされていない書き込みトランザクションにより、他のトランザクションは行にアクセスできなくなります。 Repeatable ReadRepeatable Read: 非繰り返し読み取りとダーティ リードは禁止されていますが、ファントム リード データが発生する場合があります。これは、「共有読み取りロック」と「排他的書き込みロック」によって実現できます。データを読み取るトランザクションは書き込みトランザクションを無効にし (ただし、読み取りトランザクションは許可します)、書き込みトランザクションは他のトランザクションを無効にします。 シリアル化 (シリアル化可能) シリアル化 (シリアル化可能): 厳密なトランザクション分離を提供します。トランザクションは逐次的に実行する必要がありますが、トランザクションは次々に実行することしかできず、同時に実行することはできません。トランザクションのシリアル化は、「行レベルのロック」だけでは実現できません。クエリ操作を実行したばかりのトランザクションが新しく挿入されたデータにアクセスしないようにするには、他のメカニズムを使用する必要があります。 分離レベルが高くなるほど、データの完全性と一貫性が保証されますが、同時実行パフォーマンスへの影響は大きくなります。ほとんどのアプリケーションでは、データベース システムの分離レベルを Read Committed に設定することを優先できます。ダーティ読み取りを回避でき、同時実行パフォーマンスが向上します。これにより、反復不可能な読み取り、ファントム読み取り、タイプ II の更新の消失などの同時実行性の問題が発生しますが、そのような問題が発生する可能性がある個々の状況では、アプリケーションで悲観的ロックまたは楽観的ロックを使用して制御できます。 プログラミング関連のコンテンツの詳細については、php 中国語 Web サイトのプログラミング入門 列に注目してください。
以上がトランザクション分離レベルの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。