Mysql 中 RC、RR隔离级别的原理及区别

今天分享 mysql 中 RC、RR隔离级别的原理及区别:

1、首先简介mysql四种隔离级别:

1)未提交读(READ UNCOMMITED)脏读

2) 已提交读 (READ COMMITED)简称(RC) 不可重复读

3)可重复读(REPEATABLE READ)简称(RR )------mysql默认的隔离级别

4)可串行化(SERIALIZABLE)
 

二、实验对比 RR、RC的区别:采用mysql 5.6之后的版本

1、实验1 ,采用mysql 默认的隔离级别 RR ,启动A、B两个事务对比,阿拉伯数字递增代表事务执行的时间顺序,比如 1,2,3,4.......,模拟数据库执行(前提是数据库有两条数据),结果如下图:

Mysql 中 RC、RR隔离级别的原理及区别_第1张图片

分析,执行A 事务执行 3 时,生成了视图 Read View ,此后在commit之前的查询,均是此版本的数据(执行 7 时可以见证),标准的快照读, commit 后删除Read View

2、实验2 ,采用mysql ,隔离级别设置为 RC ,启动A、B两个事务对比,阿拉伯数字递增代表事务执行的时间顺序,比如 1,2,3,4.......,模拟数据库执行(前提是数据库有两条数据),结果如下图:

Mysql 中 RC、RR隔离级别的原理及区别_第2张图片

分析,两个实验的主要区别是 执行 7 时结果不同,现象是A 可以读到其他事务已经提交的数据,原因是,RC级别下,执行当前sql 生成最新的Read View ,commit 后删除Read View。

另外,更新一条数据的操作也可以演示此效果!!!

 3、Read View生成时机的不同,造成了RC、RR级别下快照读的结果的不同:

1)、在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照即Read View将当前系统活跃的其他事务记录起来,此后调用快照读的时候,还是使用的是同一个Read View,
   所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用都是同一个Read View,所以对之后的修改不可见。
2)、在RR级别下,快照读生成ReadView时,Read View会记录此时所有其他活跃事务的快照,这些事务的修改对于当前事务都不可见的, 而早于Read View创建的事务所做的修改均是可见。
3)、在RC级别下,事务中,每次快照读都会新生成一个快照和Read View,这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因。

总结∶在RC隔离级别下,是每个快照读都会生成并获取最新的Read View,而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View,之后的快照读获取的都是同一个Read View。
 

原文链接:https://blog.csdn.net/nandao158/article/details/116005036

你可能感兴趣的:(Java,mysql,数据库,java)