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
版权声明:本文标题:数据库面试题-01:脏读、幻读、不可重复读是什么? 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727745762a1127777.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论