数据库面试题-01:脏读、幻读、不可重复读是什么?

题目-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


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值