ホームページ  >  記事  >  データベース  >  MySQL の 4 つの分離レベルの概要

MySQL の 4 つの分離レベルの概要

不言
不言転載
2019-01-30 09:57:432476ブラウズ

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。