Code Bye

事务repeatable-read隔离级别可以避免幻读吗

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隔离级别可以避免幻读吗