事务隔离级别_Mysql事务隔离级别RR与RC

本文讨论了MySQL中RC(读已提交)和RR(可重复读)两种事务隔离级别的实现原理和差异。RC隔离级别通过每次语句读取当前时间点的已提交数据,可能导致多个ReadView,而RR仅需一个ReadView,是MySQL的默认隔离级别。RR提供事务级读一致性,防止幻读,但需要使用GAP锁,RC则不处理幻读问题。可以通过`SELECT @@tx_isolation`查看当前事务级别,并用`set session transaction isolation level`进行设置。

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

在Mysql中,事务隔离级别RC(read commit)和 RR(repeatable read)两种事务隔离级别基于多版本并发控制MVCC(multi-version concurrency control)来实现。

由于RC隔离级别需要保持语句级别的一致性,事务中每一次读取都是访问当前时间点的已提交数据,因此事务中多查询语句时会创建多个不同的ReadView,开销较大,复杂度更高,而对于RR隔离级别,仅需要一个版本的ReadView,消耗更少。因此Mysql默认使用RR隔离级别。

    • RC隔离级别获得的语句级读一致性
    • RR隔离级别获得的事务级读一致性

if the transcation isolation level is REPEATABLE READ (the defalut level),all consistent reads within the same transcation read the snapshot established by the first such read in the transaction.

With READ COMMITTED isolation level,each consistent read within a transaction sets and reads its own fresh snapshot.

对于RC隔离级别,访问数据库是每次语句执行时间点的数据,而对于RR隔离级别,访问的数据是事务第一条语句执行时间点的数据。

在RR隔离级别下,执行start transaction命令后,并未开启事务,而是等到第一条语句执行时开启事务,并建立一致性读的snapshot,如果希望在start transaction时就建立一致性读的snapshot,可以使用START TRANSACTION WITH consistent snapshot。

对于RC隔离级别,不需要解决幻读的问题,当前读操作只对扫描到的数据进行加锁(行锁),无需使用GAP锁。

对于RR隔离级别,需要防止幻读的问题,当前读操作除对扫描到的数据进行加锁外,还需要使用GAP所有来防止数据插入到新记录。

GAP锁:在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。gap lock的机制主要是解决可重复读模式下的幻读问题。

幻读:指的是在一个事务A中执行了一个当前读操作,而另外一个事务B在事务A的影响区间内insert了一条记录,这时事务A再执行一个当前读操作时,出现了幻行。这和不可重复读的主要区别就在与事务A中一个是快照读,一个当前读;并且事务B中一个是任何的dml操作,一个只是insert。

--------------------------------------------------------------------------

查看当前事务级别:

SELECT @@tx_isolation;

设置当前事务级别

set session transaction isolation level read commintted;

set session transaction isolation level repeatable read;

四种事务级别区分:

968d30e3b735b5bdd012a4c9c82a0707.png
32eaa177ee318c5247e809763e50652b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值