ホームページ  >  記事  >  データベース  >  MySQL の 4 つのトランザクション分離レベル

MySQL の 4 つのトランザクション分離レベル

coldplay.xixi
coldplay.xixi転載
2020-12-15 10:24:292028ブラウズ

mysql チュートリアルこのコラムでは 4 つのトランザクション分離レベルを紹介します

MySQL の 4 つのトランザクション分離レベル

推奨 (無料): mysql チュートリアル

# この記事の実験のテスト環境: Windows 10 cmd MySQL5.6.36 InnoDB

1. トランザクションの基本要素 (ACID)

1. 原子性: トランザクション開始後、すべての操作が完了するか完了しないかのどちらかです。 、途中で停滞することは不可能です。トランザクションの実行中にエラーが発生した場合、トランザクションが開始される前の状態にロールバックされ、すべての操作は発生しなかったかのように行われます。つまり、物事は、化学で習う物質の基本単位である原子のように、分割できない全体であるということです。

2. 一貫性: トランザクションの開始前と終了後、データベースの整合性制約は破壊されません。たとえば、A が B にお金を送金した場合、A がそのお金を差し引くが、B が受け取らないということは不可能です。

3. 分離: 同時に、同じデータを要求できるのは 1 つのトランザクションだけであり、異なるトランザクション間の干渉はありません。たとえば、A は銀行カードからお金を引き出していますが、B は A の引き出しプロセスが完了するまでこのカードにお金を送金することはできません。

4. 耐久性: トランザクションの完了後、トランザクションによるデータベースへのすべての更新はデータベースに保存され、ロールバックすることはできません。

2. トランザクションの同時実行の問題

1. ダーティ リード: トランザクション A はトランザクション B によって更新されたデータを読み取り、B は操作をロールバックします。の場合、A によって読み取られたデータはダーティ データです。

2. 反復不可能な読み取り: トランザクション A は同じデータを複数回読み取り、トランザクション B はトランザクション A で同じデータを複数回読み取ります。 、データが更新および送信されたため、トランザクション A が同じデータを複数回読み取ると、一貫性のない結果が発生しました。

3. ファントム リーディング: システム管理者 A はデータベース内のすべての生徒のスコアを特定のスコアから ABCDE 成績に変更しましたが、システム管理者 B はこの時点の記録に特定のスコアを挿入しました。システム管理者Aが修正を完了したところ、まだ修正されていないレコードが1つ残っていることに気づき、まるで幻覚を見たかのような状態になり、これをファントムリーディングといいます。

要約: 非反復読み取りとファントム読み取りは混同されやすいです。非反復読み取りは変更に焦点を当て、ファントム読み取りは追加または削除に焦点を当てます。反復不能読み取りの問題を解決するには、条件を満たす行をロックするだけでよく、ファントム読み取りの問題を解決するには、テーブルをロックする必要があります

3. MySQL トランザクション分離レベル

#トランザクション分離レベル##ダーティリード##ファントムリードYesYesいいえ#シリアル化可能##No##

mysql のデフォルトのトランザクション分離レベルは、repeatable-read

4 です。例を使用して各分離レベルを説明します

1. コミットされていない読み取り:

(1) クライアント A を開き、現在のトランザクション モードを非コミット読み取り (アンコミット読み取り) に設定し、テーブル アカウントの初期値をクエリします:

(2) クライアント A のトランザクションがコミットされる前に、別のクライアント B を開いてテーブル アカウントを更新します:

トランザクションにはまだ送信されていませんが、クライアント A は B の更新されたデータをクエリできます:

(4) クライアント B のトランザクションが何らかの理由でロールバックされると、すべての操作が取り消されます。 、クライアント A によってクエリされたデータは実際にはダーティ データです:

幸運を取り除く] クライアント A によってクエリされたデータは、実際にはダーティデータです: set Balance = Balance - 50 ここでid =1でリレイの残高が350じゃなくて400になってました。おかしくないですか?データが矛盾しています。そう思ったらあなたは甘すぎます。アプリケーションでは400 -50=350を使用します。他のセッションがロールバックされたことを知りません。この問題を解決するには、読み取りコミット分離レベル

# を使用できます。2. 読み取りコミット

(1) クライアント A を開き、現在のトランザクション モードを読み取りコミット (読み取りコミット) に設定し、アカウント テーブルのすべてのレコードをクエリします:

( 2)クライアント A のトランザクションが送信される前に、別のクライアント B を開いてテーブル アカウントを更新します:

(3) この時点では、クライアント B のトランザクションはまだ送信されていません。送信完了、クライアント A は B の更新データをクエリできず、ダーティ リード問題が解決されます:

(4) クライアント B のトランザクション送信

(5) クライアント A は前のステップと同じクエリを実行しますが、結果が前のステップと一致しないため、反復不可能な読み取りの問題が発生します

3. リピータブルリード

(1) クライアント A を開き、現在のトランザクションモードをリピータブルリードに設定し、アカウントテーブルのすべてのレコードをクエリします

## アカウントのすべてのレコードは、ステップのクエリ結果と一致しています(1) 反復不可能な読み取りの問題はありません

## (4) クライアント A で、update Balance = Balance - 50 where id = 1 を実行すると、バランスは実行されます。 400-50=350にはなりませんが、リレイのバランス値は(2)の350を使って計算されるので300となり、データの整合性は崩れません。 MVCC メカニズムは反復読み取り分離レベルで使用されます。選択操作はバージョン番号を更新しませんが、スナップショット読み取り (履歴バージョン) です。挿入、更新、および削除はバージョン番号を更新し、現在の読み取り (現在のバージョン) です。バージョン)。

(5) クライアント B を再度開き、新しいデータを挿入して送信します。

(6)クライアント エンド A はアカウント テーブル内のすべてのレコードをクエリしますが、新しいデータは見つからないため、ファントム読み取りはありません

4. シリアル化

##(1 ) クライアント A を開き、現在のトランザクション モードをシリアル化可能に設定し、テーブル アカウントの初期値をクエリします:

(2) クライアント B を開き、現在のトランザクション モードをシリアル化可能に設定します。レコードを挿入するとエラーが報告されます。テーブルはロックされており、挿入は失敗します。mysql のトランザクション分離レベルがシリアル化可能である場合、テーブルはロックされるため、ファントム読み取りは発生しません。この場合、この分離レベルの同時実行性は非常に低く、開発ではほとんど使用されません。

#補足:

# 1. トランザクション分離レベルが読み取りコミットの場合、データの書き込みは対応する行のみをロックします

# 2

. トランザクション分離レベルがRepeatable Readの場合、検索条件にインデックス(主キーインデックスを含む)がある場合、デフォルトのロック方式はネクストキーロックになります。 # 検索条件

インデックスが存在しないため、データ更新時にテーブル全体がロックされます。ギャップはトランザクションによってロックされ、他のトランザクションはこのギャップにレコードを挿入できないため、ファントム読み取りが防止されます。 # 3. トランザクション分離レベルがシリアル化の場合、データの読み取りと書き込みによりテーブル全体がロックされます

4

分離レベルが高くなるほど、データの完全性と一貫性が保証されますが、同時実行パフォーマンスへの影響は大きくなります。

5. MYSQL MVCC 実装メカニズムのリファレンス リンク: https://blog.csdn.net/whoamiyang/article/details/51901888

6. ネクストキーロックについては、次のリンクを参照してください: https://blog.csdn.net/bigtree_3721/article/details/73731377

#Non-repeatable read ##Read-uncommitted Yes
Yes Non-repeatable read (read-committed) ) No
Yes Repeatable-read No
はい ##No##No

以上がMySQL の 4 つのトランザクション分離レベルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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