【数据库】数据库隔离级别的几个疑问

本文通过具体实例详细解析了不同事务隔离级别下,两个事务A和B在修改同一记录时的行为表现,包括读取脏数据、不可重复读等问题,并探讨了不同隔离级别下产生的现象及原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有两个事务,A和B,修改同一条记录,
A开始->A修改->B开始->B读取(time point 1)->A提交->B读取(time point 2)
在不同的隔离级别中,两个时间点,B读到的记录是怎样的?
现在假设person表中有一条记录ID为1,name=RDJ, A修改person表中person的name为Anthony:
注意time point 1,A并没有提交
A隔离级别B隔离级别time point 1time point 2 
READ_UNCOMMITREAD_UNCOMMITAnthonyAnthony在时间点1,读到了脏数据,因为此时A尚未提交,有可能A到最后也没提交,那B此时读取的数据就是不应该出现的。
READ_UNCOMMITREAD_COMMITRDJAnthony虽然tp1读到的是正确的数据(A尚未提交,因此为RDJ),但B在同一事物中,读取了两次的结果是不一样的,造成了不可重复读
READ_UNCOMMITREPEATABLE_READRDJRDJ虽然A提交了,但是B读取的依然是RDJ,因此可重复读
READ_UNCOMMITSERIALIZABLE--A不提交,B就无法读取
READ_COMMITREAD_UNCOMMITAnthonyAnthony发现在事务A设置隔离属性,事务B依然读取到了脏数据
REPEATABLE_READREAD_UNCOMMITAnthonyAnthony发现在事务A设置隔离属性,事务B依然读取到了脏数据
SERIALIZABLEREAD_UNCOMMITAnthonyAnthony发现在事务A设置隔离属性,事务B依然读取到了脏数据
问题1:为什么A没有提交,B也能读取到数据,难道B不是从数据库读取数据的吗?
可能A在未提交时,对数据的修改都放在了缓存中,B从缓存中读取了数据,造成脏读
问题2:为什么对A设置隔离级别不起作用?对A设置隔离级别,A不是会锁表吗?为什么B还能读到数据?mysql内部做了什么操作,实现了这四个隔离级别?

当一个事务隔离级别为Serializable时,当该事务修改或读取一行,会对该行加锁,此时其他事务不能修改该行,但可以读取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值