なぜ分離レベルを考慮する必要があるのでしょうか?
トランザクションは 同時に実行する必要があるため、 同時に実行すると、ダーティ読み取り、反復不能読み取り、仮想読み取りなどの問題が発生する可能性があるため、一部は許可されますが、一部は許可されます。発生するか発生しないかに応じて、このさまざまな程度の同時実行制御に対してさまざまな分離レベルが存在します。
MySQL でサポートされている 4 つの分離レベルは次のとおりです:
TRANSACTION_READ_UNCOMMITTED: Uncommitted read。これは、トランザクション A がコミット前にトランザクション B の変更を確認できることを意味します。このようにして、ダーティ データが読み取られ、非反復読み取りとファントム読み取りが許可されます。
TRANSACTION_READ_COMMITTED: コミットされた読み取り (Oracle のデフォルト)。コミットされていないデータの読み取りが許可されていないことを示します (ダーティ リードを防ぐため)。反復不可能な読み取りとファントム読み取りは、このレベルでも発生することが許可されます。
TRANSACTION_REPEATABLE_READ: Repeatable Read (MySQL のデフォルト)。他のトランザクションが変更された場合でも、トランザクションが失敗することなく同じデータを再度読み取ることができることが保証されていることを示します。このデータを変更しても、前後の 2 つのクエリのデータに違いは見られません。しかし、ファントム・リーディングは依然として発生します。
TRANSACTION_SERIALIZABLE: Serialization は、ダーティ リード、非反復読み取り、ファントム リードを防止する最高のトランザクション分離レベルです。シリアル実行はシングルスレッド操作と同等であり、最低の同時実行機能です。
注:
トランザクション分離レベルが高くなるほど、競合を回避するために必要なパフォーマンスが低下します。多ければ多いほど効率は低くなります。 「反復読み取り」レベルでは、実際には仮想読み取りの問題の一部を解決できますが、更新の更新によって引き起こされる仮想読み取りの問題を防ぐことはできません。仮想読み取りの発生を禁止するには、シリアル化分離レベルを設定する必要があります。
MySQL クライアントはデフォルトで反復読み取りレベルで動作します:
## 2. TRANSACTION_READ_UNCOMMITTED 分離レベルをテストします クライアント A がこの時点でロールバックすると、データベース内の zhangsan の年齢は 20 歳に復元されます。この時点では手遅れです。クライアント B がすでに撮影されています 21. ビジネスを行っています。 両方のクライアントがロールバックし、現在のトランザクションによって行われたデータへの変更を破棄し、zhangsan の年齢は 20に戻ります。
3. TRANSACTION_READ_COMMITTED 分離レベルをテストします## コミットされた読み取り分離レベルが設定されているため、トランザクション B ではダーティ 読み取りは発生しませんでした。これは、さまざまなロック機構とトランザクション同時実行の MVCC バージョン管理によって実装されます。
読み取りコミット分離レベルでは、送信されたデータをクエリすると反復不可能な読み取りが発生する可能性がありますが、これは許可されています。反復不可能な読み取りが発生したため、ファントム読み取りが確実に発生する可能性があります。
4. TRANSACTION_REPEATABLE_READ 分離レベルのテスト ##ある意味、反復読み取りによりファントム読み取りの発生を回避できます。現在の反復読み取り分離レベルでは挿入操作ができないためです。反復読み取り分離レベルは、挿入および削除操作を防ぐことはできますが、更新操作を防ぐことはできません。 実際、トランザクション A は挿入およびコミットされており、トランザクション B の aaa の経過時間の更新が成功したため、aaa はすでに存在します。同じクエリが前に存在する場合以降 2回実行した場合、データ量が異なるとファントムリードが発生します。ファントム読み取りの問題を完全に解決するには、反復読み取り分離レベルでは達成できません。分離レベルをシリアル化
5 に上げる必要があります。TRANSACTION_SERIALIZABLE 分離レベルをテストします
現象から判断すると、シリアル化することでファントムリードは解決できます。別のテーブルにデータを挿入する場合、同じ条件でのクエリはブロックされます。トランザクション B はデータを読み取っているため、これはトランザクション A が書き込むときデータが再びブロックされるとブロックされます (読み取り/書き込みロックが実装されており、読み取りと読み取りは許可されますが、読み取りと書き込み、または書き込みと書き込みは許可されません)
MySQL サーバーは、自身のトランザクション スレッドをブロックさせません。スレッドが占有しているロックは解放できず、トランザクションを実行している他のスレッドはロックを取得できず、永久にブロックされます。トランザクションを実行しているスレッドの待機時間が長すぎると、タイムアウト メカニズムがトリガーされ、スレッドがロックを解放してエラーを返します
以上がMySQL トランザクションの分離レベルは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。