REPEATABLE-READ和READ-COMMITTED幻读

原创 2015年11月19日 12:55:08

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

SESSION A:
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+———————–+—————–+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+———————–+—————–+
| REPEATABLE-READ | REPEATABLE-READ |
+———————–+—————–+
1 row in set (0.00 sec)

mysql> show variables like ‘%autocommit%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| autocommit | ON |
+—————+——-+
1 row in set (0.02 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t100;
+—–+——-+
| id | value |
+—–+——-+
| 1 | a |
| 100 | a |
| 200 | a |
| 300 | a |
+—–+——-+
4 rows in set (0.00 sec)

SESSION B:

mysql> select * from t100;
+—–+——-+
| id | value |
+—–+——-+
| 1 | a |
| 100 | a |
+—–+——-+
2 rows in set (0.00 sec)

mysql> insert into t100 values(200,’a’);
Query OK, 1 row affected (0.05 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t100 values(300,’a’);
Query OK, 1 row affected (0.19 sec)

mysql> insert into t100 values(400,’a’);
Query OK, 1 row affected (0.05 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

此时SESSION A看不到SESSION B的插入:


SESSION A:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t100;
+—–+——-+
| id | value |
+—–+——-+
| 1 | a |
| 100 | a |
| 200 | a |
| 300 | a |
| 400 | a |
+—–+——-+
5 rows in set (0.00 sec)

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+———————–+—————-+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+———————–+—————-+
| REPEATABLE-READ | READ-COMMITTED |
+———————–+—————-+
1 row in set (0.00 sec)

mysql> select * from t100;
+—–+——-+
| id | value |
+—–+——-+
| 1 | a |
| 100 | a |
| 200 | a |
| 300 | a |
| 400 | a |
+—–+——-+
5 rows in set (0.00 sec)

mysql> select * from t100;
+—–+——-+
| id | value |
+—–+——-+
| 1 | a |
| 100 | a |
| 200 | a |
| 300 | a |
| 400 | a |
| 500 | a |
+—–+——-+
6 rows in set (0.00 sec

mysql> update t100 set id=id+99;
ERROR 1062 (23000): Duplicate entry ‘100’ for key ‘PRIMARY’
mysql> update t100 set id=id+98;
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0

mysql> select * from t100;
+—–+——-+
| id | value |
+—–+——-+
| 99 | a |
| 198 | a |
| 298 | a |
| 398 | a |
| 498 | a |
| 598 | a |
| 698 | a |
+—–+——-+
7 rows in set (0.00 sec)

READ COMMITTED: 情况下 可以读取提交的数据,出现幻读 多出一条记录698

READ COMMITTED:只能读取已经提交的数据;此时:允许幻读和不可重复读,但不允许脏读,所以RC隔离级别要求解决脏读;

REPEATABLE READ:同一个事务中多次执行同一个select,读取到的数据没有发生改变;此时:允许幻读,但不允许不可重复读和脏读,所以RR隔离级别要求解决不可重复读;

  1. 几个概念

脏读:可以读取未提交的数据。RC 要求解决脏读;

不可重复读:同一个事务中多次执行同一个select, 读取到的数据发生了改变(被其它事务update并且提交);

可重复读:同一个事务中多次执行同一个select, 读取到的数据没有发生改变(一般使用MVCC实现);RR各级级别要求达到可重复读的标准;

幻读:同一个事务中多次执行同一个select, 读取到的数据行发生改变。也就是行数减少或者增加了(被其它事务delete/insert并且提交)。SERIALIZABLE要求解决幻读问题;

这里一定要区分 不可重复读 和 幻读:

MYSQL下read committed 和repeatable read级别下一致性非锁定读笔记+实测

MYSQL 的读已提交和可重复读两种模式下,都支持一致性非锁定读,这时候的读取操作不会加锁(注:读不加锁,但是写的时候,没有一致性非锁定读,下面例子会说明),新session可以对同一行进行mod操作...
  • nieyanshun_me
  • nieyanshun_me
  • 2016年01月11日 14:19
  • 1668

脏读(dirty read)不可重复读(unrepeatable read)幻读(phantom problem)解析

1. 脏读  首先区分脏页和脏数据 脏页是内存的缓冲池中已经修改的page,未及时flush到硬盘,但已经写到redo log中。读取和修改缓冲池的page很正常,可以提高效率,flush...
  • eddie_520
  • eddie_520
  • 2015年07月29日 08:39
  • 1736

mysql的可重复读REPEATABLE READ隔离级别和幻读

1)mvcc多版本控制提高读写qps 2) REPEATBLE READ 级别并不能完全避免幻读,需要加next key locks,可以使显示锁(select * where * for upda...
  • huyangyamin
  • huyangyamin
  • 2015年07月12日 11:05
  • 3481

MySQL事务隔离级别为"REPEATABLE-READ"下的"幻读"现象

我们用一个示例来讲解这种情况,及在并发事务进怎样避免这种情况。 Create Table: CREATE TABLE `t1` (   `a` int(11) NOT NULL,   `b` in...
  • xtjsxtj
  • xtjsxtj
  • 2013年11月17日 12:33
  • 4973

关于Mysql事务REPEATABLE_READ隔离级别下多版本并发控制(MVCC)重复读产生的坑的你踩过么?

前几天在系统中开发一个活动, 使用了行级锁,但是却在并发测试下出现了重大的Bug,话不多说, 直接开始. 事务的隔离级别是Mysql默认的REPEATABLE_READ. Time1: 事务A...
  • Mr_rain
  • Mr_rain
  • 2016年07月08日 11:31
  • 1678

对read committed隔离级别的全新认识:select语句能读取到,未来被其他事务修改过的数据???

关于锁,有很多可以学习的,比如,锁的粒度,锁的模式,锁的兼容性,以及隔离级别等等。 但是,具体到运行一个语句时,是怎么去获取到相应的锁的呢,比如,一个select语句,那么需要加S锁,可能是对记录...
  • yupeigu
  • yupeigu
  • 2014年03月05日 16:20
  • 1988

mysql-Innodb事务隔离级别-repeatable read详解

转载自:http://blog.csdn.net/alifel/article/details/6548075 一、事务隔离级别 ANSI/ISO SQL标准定义了4中事务隔离级别:未提交...
  • dong976209075
  • dong976209075
  • 2013年04月15日 10:47
  • 22306

Innodb事务隔离级别-repeatable read详解

ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serial...
  • gua___gua
  • gua___gua
  • 2015年03月15日 23:09
  • 751

REPEATABLE_READ事务级别MYSQL并发小例子

前几天在系统中开发一个活动, 使用了行级锁,但是却在并发测试(压力测试和并发测试非常重要)下出现了重大的Bug,话不多说, 直接开始. 事务的隔离级别是MySQL默认的REPEATABLE_RE...
  • tomli2017
  • tomli2017
  • 2017年06月11日 11:53
  • 123

mysql-Innodb事务隔离级别-repeatable read详解(转)

mysql-Innodb事务隔离级别-repeatable read详解(转) 一、事务隔离级别 ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted...
  • ai2713165
  • ai2713165
  • 2016年01月09日 17:16
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:REPEATABLE-READ和READ-COMMITTED幻读
举报原因:
原因补充:

(最多只允许输入30个字)