mysql中的rc与rr

在MySQL中,`RC`(Read Committed)和`RR`(Repeatable Read)是两种不同的事务隔离级别。它们在处理并发事务时的行为有所不同,主要体现在对幻读(Phantom Reads)的处理上。以下是这两种隔离级别的主要区别:

 

### 1. 定义

 

- **Read Committed (RC)**:

  - 在这个隔离级别下,事务只能看到已经提交的数据。这意味着一个事务在执行过程中,不会看到其他事务未提交的数据。

  - 这种隔离级别可以防止脏读(Dirty Reads),但不能防止不可重复读(Non-Repeatable Reads)和幻读(Phantom Reads)。

 

- **Repeatable Read (RR)**:

  - 在这个隔离级别下,事务在整个执行过程中会看到一致的数据快照。这意味着在一个事务开始后,即使其他事务修改了数据并提交,当前事务看到的数据也不会改变。

  - 这种隔离级别可以防止脏读、不可重复读和幻读。

 

### 2. 不可重复读(Non-Repeatable Reads)

 

- **Read Committed**:

  - 如果一个事务在第一次读取某个数据后,另一个事务修改了该数据并提交,那么当第一个事务再次读取该数据时,它会看到新的值。这就是不可重复读。

 

- **Repeatable Read**:

  - 在这个隔离级别下,事务在整个执行过程中会看到相同的数据快照,即使其他事务修改了数据并提交,当前事务看到的数据也不会改变。因此,不可重复读被防止了。

 

### 3. 幻读(Phantom Reads)

 

- **Read Committed**:

  - 幻读是指在一个事务中多次执行相同的查询,结果集却不同。例如,一个事务在第一次查询时没有找到符合条件的记录,但在第二次查询时找到了新插入的记录。这种现象在`RC`隔离级别下是可能发生的。

 

- **Repeatable Read**:

  - 在`RR`隔离级别下,MySQL使用了一种称为“Next-Key Locking”的机制来防止幻读。这不仅锁定了查询到的行,还锁定了这些行之间的间隙,防止其他事务插入新的行。因此,在`RR`隔离级别下,幻读被防止了。

 

### 4. 锁机制

 

- **Read Committed**:

  - 使用行级锁,但只锁定已读取的行,而不是整个范围。这可能导致不可重复读和幻读。

 

- **Repeatable Read**:

  - 使用行级锁和Next-Key Locks(行锁加上间隙锁)。这种机制确保了在事务执行期间,其他事务不能插入或修改当前事务可见的数据范围内的任何行。

 

### 5. 性能

 

- **Read Committed**:

  - 通常性能更好,因为锁的粒度更小,且不需要维护长时间的锁。

 

- **Repeatable Read**:

  - 由于需要维护更复杂的锁机制,可能会导致更高的锁争用和性能开销。

 

### 6. 默认设置

 

- MySQL的默认隔离级别是`Repeatable Read`(RR),而大多数其他数据库系统(如PostgreSQL、SQL Server等)的默认隔离级别是`Read Committed`(RC)。

 

### 7. 适用场景

 

- **Read Committed**:

  - 适用于对一致性要求不高,但对性能有较高要求的应用场景。

 

- **Repeatable Read**:

  - 适用于对数据一致性有严格要求,能够接受一定程度性能开销的应用场景。

 

选择合适的隔离级别取决于具体的应用需求。如果你的应用对数据的一致性要求非常高,并且可以接受一定的性能开销,那么`Repeatable Read`是一个不错的选择。反之,如果性能更为关键,且可以容忍一些不一致的情况,那么`Read Committed`可能是更好的选择。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值