ホームページ  >  記事  >  データベース  >  MySQL データベースのトランザクション分離レベルの詳細な紹介

MySQL データベースのトランザクション分離レベルの詳細な紹介

黄舟
黄舟オリジナル
2017-03-16 13:38:111581ブラウズ

この記事では、主に MySQL データベーストランザクション分離レベル関連情報の詳細な説明を紹介します。必要な方は、

データベース トランザクション分離レベル

を参照してください。データベース トランザクションには、低から高まで 4 つの分離レベルがあります。

  1. コミットされていない読み取り: ダーティ読み取りを許可します。

  2. 読み取りコミット: ダーティ リード、最も一般的に使用される分離レベル、およびほとんどのデータベースのデフォルトの分離レベルを防止します。

  3. 反復読み取り: ダーティ読み取りと非反復読み取りを防止できます。

  4. シリアル化可能: データベースの効率を低下させるダーティ リード、反復不可能な読み取り、ファントム リードを防ぐことができます。

これらの 4 つのレベルでは、ダーティ リード、非反復読み取り、ファントム リードなどの問題を 1 つずつ解決できます。

√: 発生する可能性があります

コミットされた読み取り× 注意: 主に複数の同時トランザクションの場合の分離レベルのシナリオについて説明します。 ダーティ リード、ファントム リード、ノンリピータブル リードダーティ リード: 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);
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
再現手順: MVCC (マルチバージョン同時実行制御) とリピータブル リード (RR) 分離のギャップ ロック (ネクスト
ダーティ リードとは、トランザクションがデータにアクセスしており、データが変更されているが、この変更がまだデータベースに送信されていないことを意味します。このとき、別のトランザクションもこのデータにアクセスし、このデータを使用します。
は、トランザクション内で同じデータを複数回読み取ることを指します。このトランザクションが終了する前に、別のトランザクションも同じデータにアクセスします。その後、最初のトランザクションの 2 回のデータ読み取りの間で、2 番目のトランザクションの変更により、最初のトランザクションで 2 回読み取られたデータが異なる可能性があります。このように、トランザクション内で 2 回読み取られるデータは異なるため、Non-Repeatable Read と呼ばれます。 (つまり、同じデータ内容を読み取ることができません)
例: テーブル: シミュレートされたデータ: 最初のトランザクションA:
トランザクションAのinsertステートメントである限り、 B トランザクション選択前と更新後。 MySQL InnoDB ストレージ エンジンは、マルチバージョン同時実行制御プロトコル -
キー ロック) 戦略を実装しています。ファントム読み取りはありません。このレベルでは。ファントム読み取りをテストしたい場合は、MyISAM で試してください。

クラスター化された

index (主キー インデックス) に一意性 constraint

がある場合、InnoDB はデフォルトのネクスト キー ロックをレコード ロックにダウングレードします。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。