怎么组建企业网站,家装公司电话,重庆软件外包公司,成都app软件开发幻读和不可重复读的区别
2014年09月15日 20:51:27
阅读数#xff1a;26195
MySQl
MySql默认的隔离级别为Repeatable Read#xff0c;因此只会出现幻读的情况。 幻读
事务在插入已经检查过不存在的记录时#xff0c;惊奇的发现这些数据已经存在了#xff0c;之前的检测…幻读和不可重复读的区别
2014年09月15日 20:51:27
阅读数26195
MySQl
MySql默认的隔离级别为Repeatable Read因此只会出现幻读的情况。 幻读
事务在插入已经检查过不存在的记录时惊奇的发现这些数据已经存在了之前的检测获取到的数据如同鬼影一般。
例子
在事务1中查询User表id为1的是用户否存在如果不存在则插入一条id为1的数据。 select * from User where id 1;
在事务1查询结束后事务2往User表中插入了一条id为1的数据。 insert into User(id, name) values (1, Joonwhee);
此时由于事务1查询到id为1的用户不存在因此插入1条id为1的数据。 insert into User(id, name) values (1, Chillax);
但是由于事务2已经插入了1条id为1的数据因此此时会报主键冲突对于事务1 的业务来说是执行失败的这里事务1 就是发生了幻读因为事务1读取的数据状态并不能支持他的下一步的业务见鬼了一样。这里要灵活的理解读取的意思第一次select是读取第二次的insert其实也属于隐式的读取只不过是在mysql的机制中读取的插入数据也是要先读取一下有没有主键冲突才能决定是否执行插入。 Oracle
Oracle默认的隔离级别为Read Committed因此可能出现不可重复度和幻读。 不可重复读
同样的条件你读取过的数据再次读取出来发现值不一样了。
例子
在事务1中JoonWhee读取了自己的工资为1000但是此时事务1的操作还并没有完成 后面还有1次相同的读取操作。 con1 getConnection(); select salary from employee where employeeName JoonWhee; 在事务2中这时财务人员修改了JoonWhee的工资为2000并提交了事务。 con2 getConnection(); update employee set salary 2000 where employeeName JoonWhee; con2.commit(); 在事务1中JoonWhee再次读取自己的工资时工资变为了2000 。 //con1 select salary from employee where employeeName JoonWhee; 在一个事务中前后两次读取的结果并不致导致了不可重复读。 幻读
同样的条件第1次和第2次读出来的记录数不一样。
例子
目前工资为1000的员工有10人。
事务1读取所有工资为1000的员工共读取10条记录 。 con1 getConnection(); Select * from employee where salary 1000; 这时另一个事务向employee表插入了一条员工记录工资也为1000 con2 getConnection(); Insert into employee(employeeName,salary) values(Lili,1000); con2.commit(); 事务1再次读取所有工资为1000的员工共读取到了11条记录这就产生了幻读。 //con1 select * from employee where salary 1000;
https://blog.csdn.net/v123411739/article/details/39298127