CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(45) COLLATE latin1_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
session 1:select @@tx_isolation; REPEATABLE-READ
session 2:select @@tx_isolation; REPEATABLE-READ
session 1: begin;
session 2: begin;
session 1:select * from t1; 结果为空
session 2:select * from t1; 结果为空
session 1:insert into t1(user) values(“t1”);
session 2:select * from t1; 结果为空
session 1:commit;
session 2:sellect * from t1; 结果为空
session 2:commit;
session 2:sellect * from t1; 能select 出user=t1来
2个问题:
1、是不是说明在repeatable read下,能解决幻读问题
2、为什么session 1 commit了一条insert(user=t1), session 2也还是select不出来user=t1。
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(45) COLLATE latin1_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
session 1:select @@tx_isolation; REPEATABLE-READ
session 2:select @@tx_isolation; REPEATABLE-READ
session 1: begin;
session 2: begin;
session 1:select * from t1; 结果为空
session 2:select * from t1; 结果为空
session 1:insert into t1(user) values(“t1”);
session 2:select * from t1; 结果为空
session 1:commit;
session 2:sellect * from t1; 结果为空
session 2:commit;
session 2:sellect * from t1; 能select 出user=t1来
2个问题:
1、是不是说明在repeatable read下,能解决幻读问题
2、为什么session 1 commit了一条insert(user=t1), session 2也还是select不出来user=t1。
解决方案
10
根据你测试结果,的确说明没有幻读问题,session 2 select 不出来应该是原因是那条记录在事务开始时是不存在的
30
对的,mysql中在repeatable-read隔离级别下,已解决了幻读的问题。
他解决幻读主要采用mvcc多版本并发控制,也就是,当开启一个事务的时候,会保证在这个事务里读取到的数据,都是在开始事务那个时间点的 lsn,而之后不管系统中有多少修改,插入,都只是去访问这个时间点之前的数据,所以就不会有影响。
在mysql中,实际上又用的就是2种隔离级别,一个是read committed,一个就是repeatable-read
他解决幻读主要采用mvcc多版本并发控制,也就是,当开启一个事务的时候,会保证在这个事务里读取到的数据,都是在开始事务那个时间点的 lsn,而之后不管系统中有多少修改,插入,都只是去访问这个时间点之前的数据,所以就不会有影响。
在mysql中,实际上又用的就是2种隔离级别,一个是read committed,一个就是repeatable-read