admin管理员组

文章数量:1573690

题目-01:脏读、幻读和不可重复读是什么?


来源:蚂蚁金服-社招-JAVA-二面


脏读:事务T1修改某一数据,并将其写回磁盘。事务T2读取同一数据后,T1由于某种原因被撤销。事务T1已经修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,也就是T2读到了脏数据。如下图所示:

注:事务T1首先将数据x由100修改为了90,而此时事务T2读取x,读到了90,但T1被撤销,又将数据回滚到原来的100,此时T2读到的数据就是错误的脏数据。

总结:事务 T2 读取了事务 BT1未提交的数据。


幻读:事务T2在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务T1执行了新增数据的操作并提交后,这个时候事务T1读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,称作幻读,如以下例子:

总结:事务 T2 读取了事务 T1 已提交的新增数据。


不可重复读:指事务T1读取数据X后,事务T2紧接着也想要读取数据X。而事务T1更新了数据X的值,此时事务T2读取的X值仍是原来的数据X的值,如果此时T2再次读取X,则两次读取到的值不一致。如下图所示:

注:在时间t2,事务T2读取到的x的值是100,而如果在t6时刻重复读取,此时则会变成70。

总结:事务 T2 读取了事务 T1 已提交的更改过(修改或删除)数据。


以上三种对比:

脏读:事务 T2 读取了事务 BT1未提交的数据。(一个事务读到另外一个事务还没有提交的数据)

幻读:事务 T2 读取了事务 T1 已提交的新增数据。(一个事务先后读取同一条记录,但两次读取的数据不同)

不可重复:事务 T2 读取了事务 T1 已提交的更改过(修改或删除)数据。(一个事务先后读取一个范围的记录,但两次读取的纪录数不同)


解决方案:

MySQL 里有四个隔离级别:

  •  Read uncommttied(可以读取未提交数据)
  • Read committed(可以读取已提交数据)
  • Repeatable read(可重复读)
  • Serializable(可串行化) 

  

脏读:把事务隔离级别调整到READ COMMITTED

幻读:把事务隔离级别调整到REPEATABLE READ

不可重复:把事务隔离级别调整到SERIALIZABLE


本文标签: 面试题数据库脏读幻读