一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据

上面展示了InnoDB存储引擎一致性的非锁定读。之所以称为非锁定读,因为不需要等待访问的行上X锁的释放

快照数据是指该行之前版本的数据,该实现是通过undo段来完成。而undo用来事务中的回滚数据,因此快照数据本身没有额外的开销,此外,读取快照数据不需要上锁,因为没有事务需要对历史数据进行修改操作

可以看到,非锁定读机制极大地提高了数据库的并发性,在InnoDB存储引擎的默认设置下,这是默认的读写方式,即读不会占用和等待表上的锁。但是在不同的事务隔离级别下,读取的方式不同,并不是每个事务隔离级别下都是采用非锁定的一致性读,此外,即使使用非锁定的一致性读,但是对于快照数据的定义也各不相同

快照其实是当前行数据之前的历史版本,每行记录可能有多个版本,如图显示,一个行记录可能有不止一个快照数据,一般称这种技术为多版本技术,因此带来的并发控制。称为多版本并发控制(Multi Version Concurrency Control,MVCC)

在事务隔离级别RC和RR下,InnoDB存储引擎引擎使用非锁定的一致性读。然而,对于快照数据的定义却不相同。在rc事务隔离级别下,对于快照数据,非一致性读总是被锁定行的最新一份快照数据.而在RR事务隔离级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本。

测试表中数据如下:
mysql> select * from t_test where id=20;
+----+--------+
| id | name |
+----+--------+
| 20 | test20 |
+----+--------+
1 rows in set (0.00 sec)

在RC隔离级别下
在会话1:
mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set, 1 warning (0.00 sec)

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

mysql> select * from t_test where id=20;
+----+--------+
| id | name |
+----+--------+
| 20 | test20 |
+----+--------+
1 row in set (0.00 sec)

在会话2:
mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set, 1 warning (0.00 sec)

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

mysql> select * from t_test where id=20;
+----+--------+
| id | name |
+----+--------+
| 20 | test20 |
+----+--------+
1 row in set (0.00 sec)

mysql> update t_test set id=200 where id=20;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

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

再到会话1中查询,结果为空
mysql> select * from t_test where id=20;
Empty set (0.01 sec)

在RR隔离级别下
在会话1:
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

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

mysql> select * from t_test where id=20;
+----+--------+
| id | name |
+----+--------+
| 20 | test20 |
+----+--------+
1 row in set (0.00 sec)

在会话2:
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

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

mysql> select * from t_test where id=20;
+----+--------+
| id | name |
+----+--------+
| 20 | test20 |
+----+--------+
1 row in set (0.00 sec)

mysql> update t_test set id=200 where id=20;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

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

再到会话1中查询,结果为
mysql> select * from t_test where id=20;
+----+--------+
| id | name |
+----+--------+
| 20 | test20 |
+----+--------+
1 row in set (0.00 sec)

MySQL一致性非锁定读的更多相关文章

  1. MySQL——一致性非锁定读(快照读)&MVCC

    MySQL--一致性非锁定读(快照读) MySQL数据库中读分为一致性非锁定读.一致性锁定读 一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现. 一致性锁定读(当前读) ...

  2. MySQL中一致性非锁定读

    一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...

  3. 14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读

    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读意味着 InnoDB 使用多版本来实现一个查询数据库的快照在某个时间点. 查看看到的事务做出的改变被提 ...

  4. 14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读

    14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读 意味着 InnoDB 使用多版本来保护查询一个数据库在当前时间点的快照. 查询看到被事务做出的修改, ...

  5. MySQL Transaction--快照读和当前读

    在MySQL读取数据时可以按照是否使用一致性非锁定读来分为快照读和当前读:1.快照读:MySQL使用MVCC (Multiversion Concurrency Control)机制来保证被读取到数据 ...

  6. 一步一步学MySQL-一致性非锁定读和锁定读

    一致性非锁定读(consistent nonlocking read) 一致性非锁定读是值InnoDB存储引擎通过多版本控制(multi versioning)的方式来读取当前执行时间数据库中的数据. ...

  7. LVS+Keepalived实现MySQL从库读操作负载均衡

    http://www.osyunwei.com/archives/7464.html (学习运维知识好站) 说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.1 ...

  8. LVS+Keepalived实现MySQL从库读操作负载均衡配置

    转载于osyunwei 说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.126 MySQL从服务器:192.168.21.127,192.168.21.128 ...

  9. MySQL 一致性读 深入研究

    一致性读,又称为快照读.使用的是MVCC机制读取undo中的已经提交的数据.所以它的读取是非阻塞的. 相关文档:http://dev.mysql.com/doc/refman/5.6/en/innod ...

随机推荐

  1. hdu1387 模拟队列

    Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  2. UBoot添加命令的方法

    1. 具体实现步骤 ① 在./common文件夹下新建cmd_led.c,并在此文件中添加如下内容 #include <common.h> #include <command.h&g ...

  3. spring boot 启动时运行代码(2)ApplicationListener

    项目概览: StepExecutor: @Component @Slf4j public class StepExecutor implements Runnable { @Autowired pri ...

  4. 关于WampServer一些配置修改

    1.解决WAMP mysql中文乱码问题(在mysql的my.ini文件中) 1).找到client字段并添加:default-character-set=utf8 2).找到mysql字段并添加: ...

  5. 转 Logs are not shipped to the physical standby database

    http://www.oracle-ckpt.com/dataguard_troubleshoot_snapper/ ######sample primay scripts: spool dg_Pri ...

  6. JavaSE---关键字---return,break,continue

    1.[break] 1.1 默认   用来结束   整个循环: package com.exiuge.mytest; public class BreakTest { public static vo ...

  7. js生成随机码(只含有数字和字母的随机码)

    /*** randomWord 产生任意长度随机字母数字组合** randomFlag 是否任意长度 min 任意长度最小位[固定位数] max 任意长度最大位*/ function randomWo ...

  8. Hive学习(一)

    https://www.cnblogs.com/qingyunzong/p/8707885.html http://www.360doc.com/content/16/1006/23/15257968 ...

  9. MongoDB数据库常用操作

    推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...

  10. Jenkins+Ant+Jmeter接口自动化集成测试

    一.Jmeter+ant 1.首先我们默认Jmeter脚本已经录制好了,并测试通过,存在(查询模块.jmx)脚本 2.将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.j ...