この記事では、MySQL の 4 つの分離レベルについて説明します。必要な方は参考にしていただければ幸いです。
トランザクション分離は想像よりも複雑です。SQL 標準では 4 つのレベルの分離レベルが定義されています。一般に、分離レベルが低いほど同時実行性が高く、システム オーバーヘッドが低くなります (推奨コース: MySQL ビデオ チュートリアル )
READ UNCOMMITTED
このレベルは Uncommitted Read です。このレベルでは、トランザクション内の変更は、コミットされていない場合でも他のトランザクションに表示されます。トランザクションはコミットされていないデータを読み取ることができます。これは ダーティ リーディング とも呼ばれます。このレベルでは多くの問題が発生し、パフォーマンスの点では他のレベルよりもそれほど優れているわけではありませんが、他のレベルの利点の多くが欠けています。よほどのことがない限り、実用化されることはほとんどありません。
READ COMMITTED
このレベルは Committed Read です。これは、ほとんどのデータベース システムのデフォルトの分離レベルですが、MySQL では異なります。このレベルは分離の単純な定義を満たしています。つまり、トランザクションが開始されると、コミットされたトランザクションによって行われた変更のみが「表示」されます。つまり、トランザクションが最初からコミットされるまでに行われた変更は、他のトランザクションには表示されません。同じクエリを 2 回実行すると異なる結果が生じる可能性があるため、このレベルは Non-repeatable read と呼ばれることもあります。
REPEATABLE READ
このレベルは Repeatable Read で、MySQL のデフォルトのトランザクション分離レベルです。これにより、ダーティ読み取りの問題が解決され、同じトランザクション内で同じレコードを複数回読み取った結果の一貫性が保証されます。
しかし、理論的には、このレベルでは別の問題、幻聴を解決できません。いわゆるファントム読み取りとは、トランザクションが特定の範囲内のレコードを読み取るときに、別のトランザクションがその範囲内のレコードを再度読み取るときに、ファントム行##が生成されることを意味します。 #。
ファントム読み取りの例: 最初のトランザクションはテーブル内のデータを変更します。たとえば、この変更にはテーブル内の「すべてのデータ行」が含まれます。同時に、2 番目のトランザクションもこのテーブルのデータを変更します。この変更により、テーブルに「新しいデータの行」が挿入されます。その後、最初のトランザクションを操作するユーザーは、あたかも幻覚が起こったかのように、テーブル内にまだ変更されていないデータ行があることに気づくでしょう。
InnoDB ストレージ エンジンは、マルチバージョンを通じてファントム読み取りを解決します。同時実行制御の問題。SERIALIZABLE
このレベルはシリアル化可能であり、最も高い分離レベルです。トランザクションを強制的にシリアルに実行することで、前述のファントム読み取りの問題を回避します。つまり、このレベルでは読み取られたデータのすべての行がロックされるため、多くのタイムアウトやロック競合の問題が発生する可能性があります。ダーティ リードの可能性 | 非反復読み取りの可能性 | ファントム リードの可能性 | ロック読み取り | |
---|---|---|---|---|
はい | はい | はい | No | |
No | Yes | Yes | No | |
いいえ | いいえ | はい | いいえ | |
No | No | No | Yes |
以上がMySQL の 4 つの分離レベルの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。