创建表结构
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`text` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`),
KEY `idx_age` (`age`),
KEY `idx_name_age` (`name`,`age`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
初始化数据
INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('a', '10', 'a');
INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('b', '20', 'b');
INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('c', '30', 'c');
INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('d', '40', 'd');
INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('e', '50', 'e');
T1 - 设置隔离级别
REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select @@global.transaction_isolation,@@transaction_isolation;
T2 - 设置隔离级别
REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select @@global.transaction_isolation,@@transaction_isolation;
T1 - 事务1开启,第一次查询
T1第一次查询
start transaction;
SELECT * FROM test_isolation.user where id = 6;
T2 - 事务2开启,插入数据行
插入一条未提交的数据行
start transaction;
INSERT INTO test_isolation.user (`id`, `name`, `age`, `text`) VALUES ('6', 'f', 60, 'f');
SELECT * FROM test_isolation.user;
T1 - 第2次查询
事务1无法读到了事务2未提交的数据行,避免了脏读
SELECT * FROM test_isolation.user where id = 6;
T2 - 事务2提交
T1 - 第3次查询
事务1依然无法读到事务2已提交的数据行,阻止了不可重复读(可以在同一事物中看到相同的数据视图)
SELECT * FROM test_isolation.user where id = 6;
T1 - 插入了一条T2已经插入并提交的数据f,但是T1在当前事务还无法看到f
- 既然看不到这条数据为什么无法插入
INSERT INTO test_isolation.user (`id`, `name`, `age`, `text`) VALUES ('6', 'f', 60, 'f');
T1 - T1非常困惑,因此T1再次查询是否存在这条记录
- T1依然无法看到这条记录
SELECT * FROM test_isolation.user where id = 6;