この記事では、主に MySQL データベーストランザクション分離レベル関連情報の詳細な説明を紹介します。必要な方は、
データベース トランザクション分離レベル
を参照してください。データベース トランザクションには、低から高まで 4 つの分離レベルがあります。
- コミットされていない読み取り: ダーティ読み取りを許可します。
- 読み取りコミット: ダーティ リード、最も一般的に使用される分離レベル、およびほとんどのデータベースのデフォルトの分離レベルを防止します。
- 反復読み取り: ダーティ読み取りと非反復読み取りを防止できます。
- シリアル化可能: データベースの効率を低下させるダーティ リード、反復不可能な読み取り、ファントム リードを防ぐことができます。
これらの 4 つのレベルでは、ダーティ リード、非反復読み取り、ファントム リードなどの問題を 1 つずつ解決できます。
√: 発生する可能性があります
√
コミットされた読み取り | | × |
|
注意: 主に複数の同時トランザクションの場合の分離レベルのシナリオについて説明します。
ダーティ リード、ファントム リード、ノンリピータブル リード |
| ダーティ リード: |
ダーティ リードとは、トランザクションがデータにアクセスしており、データが変更されているが、この変更がまだデータベースに送信されていないことを意味します。このとき、別のトランザクションもこのデータにアクセスし、このデータを使用します。 |
Non-repeatable read: |
は、トランザクション内で同じデータを複数回読み取ることを指します。このトランザクションが終了する前に、別のトランザクションも同じデータにアクセスします。その後、最初のトランザクションの 2 回のデータ読み取りの間で、2 番目のトランザクションの変更により、最初のトランザクションで 2 回読み取られたデータが異なる可能性があります。このように、トランザクション内で 2 回読み取られるデータは異なるため、Non-Repeatable Read と呼ばれます。 (つまり、同じデータ内容を読み取ることができません) |
| ファントム読み取り: |
は、トランザクションが独立して実行されない場合に発生する現象を指します。たとえば、最初のトランザクションがテーブル内のデータを変更することです。テーブル内のすべてのデータ行が含まれます。同時に、2 番目のトランザクションもこのテーブルのデータを変更します。この変更により、テーブルに新しいデータの行が挿入されます。その後、最初のトランザクションを操作するユーザーは、あたかも幻覚が起こったかのように、テーブル内にまだ変更されていないデータ行が存在することに気づくでしょう。
例: |
テーブル: |
CREATE TABLE `cc_wsyw126_user_test_isolation_copy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(64) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `ix_age` (`age`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ログイン後にコピー
シミュレートされたデータ: |
INSERT INTO `cc_wsyw126_user_test_isolation_copy` (`password`, `age`)
VALUES
('1', 1),
('2', 2),
('3', 3),
('4', 4);
ログイン後にコピー
最初のトランザクションA: |
start transaction
insert into cc_wsyw126_user_test_isolation_copy (password, age) values ('5',5)
commit
ログイン後にコピー
2番目のトランザクションB:
start transaction
update cc_wsyw126_user_test_isolation_copy set age = 2 where password >='2'
select * from cc_wsyw126_user_test_isolation_copy where password >= '2';
commit
ログイン後にコピー
| 再現手順: |
トランザクションAのinsertステートメントである限り、 B トランザクション選択前と更新後。 |
MySQL InnoDB ストレージ エンジンは、マルチバージョン同時実行制御プロトコル - | MVC
C (マルチバージョン同時実行制御) とリピータブル リード (RR) 分離のギャップ ロック (ネクスト
キー ロック) 戦略を実装しています。ファントム読み取りはありません。このレベルでは。ファントム読み取りをテストしたい場合は、MyISAM で試してください。
クラスター化された
index (主キー インデックス) に一意性 constraint
がある場合、InnoDB はデフォルトのネクスト キー ロックをレコード ロックにダウングレードします。
以上がMySQL データベースのトランザクション分離レベルの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。