ファントム読み取りと非反復読み取りの違い
1) 「非反復読み取り」とは、同じデータを複数回読み取ることを指します。トランザクションデータ内。このトランザクションが終了する前に、別のトランザクションも同じデータにアクセスします。その後、最初のトランザクションの 2 回のデータ読み取りの間で、2 番目のトランザクションの変更により、最初のトランザクションで 2 回読み取られたデータが異なる可能性があります。このように、トランザクション内で 2 回読み取られるデータは異なるため、Non-Repeatable Read と呼ばれます。
たとえば、編集者は同じ文書を 2 回読み取りますが、読み取りの間に作成者は文書を書き直します。編集者が文書をもう一度読むと、文書は変更されています。生の読み取りは再現できません。この問題は、編集者が作成者が書き終わった後にのみドキュメントを読み取ることができる場合に回避できます。
この状況を回避するには、通常、set tran 分離レベル反復読み取りを使用して分離レベルを設定します。テーブル T のデータを 2 回読み取るときに、トランザクション B がテーブル T のデータを変更しようとすると (詳細はトランザクション A がデータを読み取るときです)、トランザクション A がコミットするまでブロックされます。これにより、トランザクション A によって 2 回読み取られたデータの整合性が保証されます。
2) ファントム読み取りとは、トランザクションが独立して実行されない場合に発生する現象を指します。たとえば、最初のトランザクションはテーブル内のデータを変更しますが、この変更にはテーブル内のすべてのデータ行が含まれます。同時に、2 番目のトランザクションもこのテーブルのデータを変更し、この変更により新しいデータの行がテーブルに挿入されます。
その後、最初のトランザクションを操作するユーザーは、まるで幻覚を見ているかのように、テーブル内にまだ変更されていないデータ行が存在することに気づくでしょう。
たとえば、編集者が作成者によって送信されたドキュメントを変更しますが、本番環境でその変更がドキュメントのマスター コピーにマージされると、作成者が新しい未編集の内容をドキュメントに追加したことがわかります。この問題は、編集者と制作部門が元のドキュメントの作業を完了するまで、誰もドキュメントに新しい内容を追加できないようにすれば回避できます。
上記の例でも、トランザクション A はテーブル T のデータを 2 回読み取る必要があります。反復読み取りを設定すると、トランザクション B によるデータの変更を防ぐことができますが、トランザクション B はテーブル T に新しいデータを挿入できます。
この問題を防ぐには、最も高いトランザクション分離レベルをシリアル化可能に設定することを検討できます。その結果、トランザクション B は、テーブル T に新しいデータを挿入する前に、トランザクション A が送信されるのを素直に待つだけで、ファントム読み取りを回避できます。
以上がファントムリードとノンリピートリードの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。