技术文章

什么是脏读?什么是不可重复读?

脏读

脏读,我们在开发过程中应该会经常听说,一个事务中访问到了另外一个事务中未提交的数据;

1会话1和会话2开始;

2.会话2做了一个update操作,修改了一个字段的值;

3.会话1执行select,读到了这个字段;

4.会话2执行commit;会话1也结束;

5.如果会话2执行了commit的话,是没有什么问题的;但是如果会话2最后执行了rollback呢?

什么是不可重复读

不可重复读

在一个事务内,多次对数据进行了读取,但是查询到的数据不一致;因为在多次查询之间,另外一个事务可能修改了数据;

1.会话1和会话2开始;

2.会话1执行select,读取到A表的X字段;

3.会话2执行update,修改了A表的X字段;并commit;

4.会话1执行select,又读取到A表的X字段;这时候X字段的值和上一次的不一样;

5.会话1结束;

6.虽然两次读取的值不一样,但是并没有什么错,因为确实被修改、而且已经提交了。

什么是不可重复读

幻读

还有一个名字叫做幻读,其实和不可重复读类似。

不可重复读,指一个事务内根据同一个查询条件查询,前后查询到的同一行记录的值不一样;

幻读是指一个事务内,多次根据同个条件查出来的记录行数不一样;过程就不在这里写了,大家可以把会话2的update改成insert或delete。