[mysql]のREPEATABLE-READ独立性レベルがupdate操作に与える影響を確認する

1697 ワード

独立性レベルは省略します.
1、準備
初期化データ:
CREATE TABLE `t_tran` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '  ',
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

MariaDB [aliyun01]> select * from t_tran;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |    1 |    10 |
|  2 |    2 |    2 |
|  3 |    3 |    3 |
+----+------+------+

オープントランザクション:ariaDB[aliyun 01]>start transaction;Query OK, 0 rows affected (0.00 sec)
2、検証
 
事務A
事務B
T1
select * from t_tran;         (id=1,b=10)
 
T2
 
 select * from t_tran; (id=1,b=10)
T3
update t_tran set b=b-10 where id=1 and b>=10;
 
T4
select * from t_tran; (id=1,b=0)
select * from t_tran; (id=1,b=10)
T5
 
update t_tran set b=b-10 where id=1 and b>=10;//待ち始める
T6
commit;
実行完了、影響行数0
T7
select * from t_tran; (id=1,b=0)    
select * from t_tran; (id=1,b=10)
T8
 
commit;
T9
select * from t_tran; (id=1,b=0)
select * from t_tran; (id=1,b=10)
3、まとめ:
トランザクション実行中、insertのデータは、他のトランザクションには表示されません.
シーン1:1、トランザクションAがデータXをupdateすると、commitの前にトランザクションBのデータXの変更が待機します.2、取引Aがcommit操作を行う3、取引Bが実行開始を待つ場合、取引Aがデータxに対する修正-Bの修正条件を満たさない場合、Bが実行するデータupdateは無効(実行影響行数0)4、取引Bがcommitの前で、取引AがデータXに対する修正が見えない
シーン2:1、トランザクションAがデータXをupdateすると、commitの前にトランザクションBのデータXの変更が待機します.2、取引Aがcommit操作を行う3、取引Bが実行を開始するのを待つ場合、取引Aがデータxに対する修正-Bの修正条件を満たすと、Bが実行したデータupdateは成功し、その結果、取引Aと取引Bが前後してデータXに対して変更した最後の結果4、取引Bがcommitの前に、取引AがデータXに対する修正を見ることができない.