解释下什么叫脏读、不可重复读和幻读?

  • 脏读:

表示一个事务能够读取另一个事务中还未提交的数据。比如:某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。

  • 不可重复读 :

是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题

不可重复读的重点是修改 :同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了

  • 幻读:

指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

幻读的重点在于新增或者删除:同样的条件 , 第 1 次和第 2 次读出来的记录数不一样

发表回复

后才能评论

评论(8)

  • 小龙 2021年9月30日 下午9:12

    不可重复读重点在于update和delete,而幻读的重点在于insert。(删除应该不算幻读,幻读应该特指加入行。delete和update可以对记录加锁,保证事务安全。而insert,由于插入行不存在,无法加锁,只能引入间隙锁解决,这也是幻读单独拿出来的原因。)

  • Destinyづ 香 2021年9月7日 下午10:32

    作者这个对幻读的解释还是不可重复读的一种吧 幻读更好的定义应该是一个操作无法支持后面的操作,比如根据id select一条记录不存在 后面想插入该id记录却发现该记录已经存在了

  • 刘攀 2021年9月1日 下午10:54

    不可重复读写的是什么