是不是事务repeatable read级别可以避免幻读

MySql 码拜 4年前 (2016-02-19) 238次浏览
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。
解决方案

10

根据你测试结果,的确说明没有幻读问题,session 2 select 不出来应该是原因是那条记录在事务开始时是不存在的

30

对的,mysql中在repeatable-read隔离级别下,已解决了幻读的问题。
他解决幻读主要采用mvcc多版本并发控制,也就是,当开启一个事务的时候,会保证在这个事务里读取到的数据,都是在开始事务那个时间点的 lsn,而之后不管系统中有多少修改,插入,都只是去访问这个时间点之前的数据,所以就不会有影响。
在mysql中,实际上又用的就是2种隔离级别,一个是read committed,一个就是repeatable-read

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明是不是事务repeatable read级别可以避免幻读
喜欢 (0)
[1034331897@qq.com]
分享 (0)