<pre name="code" class="html">显然 RR 支持 gap lock(next-key lock),而RC则没有gap lock。因为MySQL的RR需要gap lock来解决幻读问题。而RC隔离级别则是允许存在不可重复读和幻读的。所以RC的并发一般要好于RR; RR 和RC 幻读问题: 幻读:同一个事务中多次执行同一个select, 读取到的数据行发生改变。 也就是行数减少或者增加了(被其它事务delete/insert并且提交)。SERIALIZABLE要求解决幻读问题; mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) Sessio 1: mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) mysql> use scan; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> select * from t1 where id>100; ERROR 1054 (42S22): Unknown column 'id' in 'where clause' mysql> select * from t1 where c1>100; +------+ | c1 | +------+ | 119 | | 200 | | 300 | | 400 | | 8999 | +------+ 5 rows in set (0.00 sec) Sessio 2: mysql> insert into t1 values(9999); Query OK, 1 row affected (0.01 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) Session 1 再次查询: mysql> select * from t1 where c1>100; +------+ | c1 | +------+ | 119 | | 200 | | 300 | | 400 | | 8999 | +------+ 5 rows in set (0.00 sec) 此时在RR模式下没有幻读 设置隔离级别为RC: mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED | +----------------+ 1 row in set (0.00 sec) Session 1: mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED | +----------------+ 1 row in set (0.00 sec) mysql> use scan; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> select * from t1 where c1>100; +------+ | c1 | +------+ | 119 | | 200 | | 300 | | 400 | | 8999 | | 9999 | +------+ 6 rows in set (0.00 sec) Session 2: mysql> select * from t1; +------+ | c1 | +------+ | 33 | | 34 | | 87 | | 89 | | 119 | | 200 | | 300 | | 400 | | 8999 | | 9999 | +------+ 10 rows in set (0.00 sec) mysql> insert into t1 values(7777777); Query OK, 1 row affected (0.01 sec) Session 1再次查询: mysql> select * from t1 where c1>100; +---------+ | c1 | +---------+ | 119 | | 200 | | 300 | | 400 | | 8999 | | 9999 | | 7777777 | +---------+ 7 rows in set (0.00 sec) 说明RC模式下,可以幻读
RR 和RC 幻读问题
转载
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
RR隔离级别的查询的幻读场景
RR隔离级别的查询的幻读场景
RR 隔离 级别 幻读场景 -
MySQL: 幻读演示 & 解决幻读问题
幻读: select 某记录是否存在,不存在,准备插入此记录,但 ...
Back end 数据 数据库 隔离级别 提交事务 -
第二十章 幻读是什么,幻读有什么问题?
第二十章 幻读是什么,幻读有什么问题?CREATE TABLE `t` ( `id` int(11) NOT NU
mysql 事务 binglog 可重复读 幻读 -
MySQL在RR级别下到底会不会造成幻读【转载】
说到快照读,就得先说一下快照,而说到快照,就得说说MVCC。快照是属于MVCC中的一个概念。在RR级别
mysql 数据库 sql 数据 MySQL