脏读、不可重复读、幻读

脏读

一个事务在处理过程中读取了另外一个事务未提交的数据。
你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。

脏读、不可重复读、幻读_第1张图片

 

不可重复读

通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。
与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。

脏读、不可重复读、幻读_第2张图片

 

幻读

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

错误理解:说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 15 条记录。这其实并不是幻读,既然第一次和第二次读取的不一致,那不还是不可重复读吗,所以这是不可重复读的一种。

脏读、不可重复读、幻读_第3张图片 

这里是在RR级别下研究(可重复读),因为 RU / RC 下还会存在脏读、不可重复读,故我们就以 RR 级别来研究 幻读,排除其他干扰。

  1. 事务A,查询是否存在 id=5 的记录,没有则插入,这是我们期望的正常业务逻辑。
  2. 这个时候 事务B 新增的一条 id=5 的记录,并提交事务。
  3. 事务A,再去查询 id=5 的时候,发现还是没有记录(因为这里是在RR级别下研究(可重复读),所以读到依然没有数据)
  4. 事务A,插入一条 id=5 的数据。
  5. 最终 事务A 提交事务,发现报错了。这就很奇怪,查的时候明明没有这条记录,但插入的时候 却告诉我 主键冲突,这就好像幻觉一样。这才是所有的幻读。

不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。

你可能感兴趣的:(java核心知识点整理,java,数据库,开发语言)