MySQL独立性レベル

4691 ワード

トランザクションにはACIDの4つの機能があります.
しかし、Isolationの同時発生は、次のような問題を引き起こす可能性があります.
1.ダーティリード
コミットされていない汚れたデータの読み取りを許可します.
2.繰り返し不可
時刻T 1で記録を読み出した場合、T 2で同じ記録をもう一度読み直したい場合、これらの記録は変更されたり、消えたりする可能性があります.
3.幻読み
重複しない読み取りを解決し、同じトランザクションでクエリーの結果がトランザクションの開始時の状態(一貫性)であることを保証します.しかし、別のトランザクションが同時に新しいデータをコミットすると、このトランザクションが更新されると、これらの新しいデータが「驚く」発見され、前に読んだデータが「幽霊」のような幻覚になるようです.
ANSI/ISOによって定義されるSQL-92規格によって定義される4つの独立性レベル
1.Read Uncommitted
2.Read Committed
3.Repeatable Read
4.Serializable
ぶんりかいべつ
汚読
繰り返し不可
まぼろし読み
Read Uncommitted
Y
Y
Y
Read Committed
N
Y
Y
Repeatable(default)
N
N
Y
Serializable
N
N
N
次はMysqlデータベースでいくつかの小さな実験をします
Mysqlバージョン番号
mysql> select version();
+------------+
| version()  |
+------------+
| 5.1.52-log |
+------------+
1 row in set (0.00 sec)

InnoDBストレージエンジンシステムレベルの独立性レベルとセッションレベルの独立性レベルの表示
mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

セッションレベルの独立性レベルの変更
Session 1:
mysql> set session tx_isolation='read-uncommitted';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+------------------+
| @@global.tx_isolation | @@tx_isolation   |
+-----------------------+------------------+
| REPEATABLE-READ       | READ-UNCOMMITTED |
+-----------------------+------------------+
1 row in set (0.00 sec)


Session 2:
mysql> select @@global.tx_isolation, @@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

システムレベルの独立性レベルの変更
Session 1:
mysql> set global tx_isolation='read-uncommitted';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+------------------+
| @@global.tx_isolation | @@tx_isolation   |
+-----------------------+------------------+
| READ-UNCOMMITTED      | READ-UNCOMMITTED |
+-----------------------+------------------+
1 row in set (0.00 sec)

Session 2:
mysql> select @@global.tx_isolation, @@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| READ-UNCOMMITTED      | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

SQL文の自動コミットを閉じる
mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)

SQL文の自動コミットがオフになっているかどうかを確認
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

実験表の作成
mysql> create table tao (col1 tinyint unsigned, col2 varchar(20), primary key(col1));
Query OK, 0 rows affected (0.08 sec)

mysql> show create table tao \G;
*************************** 1. row ***************************
       Table: tao
Create Table: CREATE TABLE `tao` (
  `col1` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `col2` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ダーティリードのプレゼンテーション
独立性レベルをRead Committedに変更した場合、ダーティリードの問題はありません.
mysql> set global tx_isolation='read-committed';
Query OK, 0 rows affected (0.00 sec)
mysql> set session tx_isolation='read-committed';
Query OK, 0 rows affected (0.00 sec)

プレゼンテーションの繰り返し不可
独立性レベルをRepeatable Readに変更しても、再読み取り不可の問題はありません.
mysql> set global tx_isolation='repeatable-read';
Query OK, 0 rows affected (0.00 sec)

mysql> set session tx_isolation='repeatable-read';
Query OK, 0 rows affected (0.00 sec)

まぼろし読み
完全にシリアル化されたSerializableに独立性レベルを変更しても、幻読みの問題はありません.
mysql> set global tx_isolation='serializable';
Query OK, 0 rows affected (0.00 sec)

mysql> set session tx_isolation='serializable';
Query OK, 0 rows affected (0.00 sec)

この場合、1つのトランザクションのみが実行され、他のトランザクションはそのトランザクションが実行されるまで待たなければなりません.同時ではなく、単純なシリアルです.