首页 > 学院 > 开发设计 > 正文

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

2019-11-08 20:53:49
字体:
来源:转载
供稿:网友
假设有两个事务,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时,当该事务修改或读取一行,会对该行加锁,此时其他事务不能修改该行,但可以读取。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表