14.3.2.3 Consistent Nonlocking Reads  一致性非锁定读

一致性读 意味着 InnoDB 使用多版本来保护查询一个数据库在当前时间点的快照。

查询看到被事务做出的修改, 在那个时间点之前提交的, 随后没有改变或者没有提交事务。

例外是查询看到了在同一个会话里的更早的语句的修改。。

这个例外导致了下面的异常;如果你更新表的一些记录,一个SELECT 看到的更新记录的最新的版本,

但是也看到了老版本的记录。如果其他会话同时更新相同的表,异常意味着你会按到数据库中从未出现的表的

状态。

如果事务隔离是REPEATABLE READ(默认级别),所有的一致性读在相同的事务读取之前第一个read 创建的快照

你可以得到一个更加新鲜的快照 对于你的查询,通过提交当前的事务,在执行新的查询:

在READ COMMITED 隔离级别下,每个一致性读读取它自己的新鲜的快照

一致性读 是默认的模式InnoDB 处理SELECT 语句在READ COMMITTED and REPEATABLE READ 隔离级别。

一个一致性读 不设置任何锁在它访问的表上,因此其他会话是自由的修改那些表在相同的时间段

假设 你运行在默认的隔离级别REPEATABLE READ。

当你执行一个执行读(即,一个普通的SELECT 语句)

InnoDB 给你的额事务一个时间点根据 你查询看到的数据库

如果另外的事务删除一个记录 并且在你的这个时间点后提交,你不会看到已经删除的记录,更新也是同样对待

。

注意:

数据库状态的快照应用于SELECT 语句,对于DML语句不需要。

如果你插入或者修改一些记录,然后提交这个事务,一个DELETE 或者UPDATE 语句从另外一个并发的

REPEATABLE READ 事务可能影响那些刚刚提交的行,尽管会话不能查询它们。

如果一个事务Update或者delete 记录被不同的事务提交,那些改变变的可见 低于当前事务。

测试:

Session 1:

mysql> select * from t1;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 235 | 1 | a1 |
| 236 | 2 | a2 |
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
+-----+------+------+
11 rows in set (0.00 sec) Session 2: [root@wx03 ~]# cat t1.pl
#!/usr/bin/perl
use DBI;
$db_name='scan';
$ip='127.0.0.1';
$user="root";
$passwd="1234567"; $dbh = DBI->connect("dbi:mysql:database=$db_name;host=$ip;port=3306",$user,$passwd,{
RaiseError => 1,
AutoCommit => 0
}) or die "can't connect to database ". DBI-errstr;
eval{
$dbh->do("delete from t1 where id=1") ;
$dbh->commit();};
if( $@ ) {
warn "Database error: $DBI::errstr\n";
$dbh->rollback(); #just die if rollback is failing
};
$dbh->disconnect;
[root@wx03 ~]# perl t1.pl Session 1: mysql> delete from t1 where id=1;
Query OK, 0 rows affected (0.00 sec) mysql> select * from t1;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 235 | 1 | a1 |
| 236 | 2 | a2 |
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
+-----+------+------+
11 rows in set (0.01 sec) mysql> rollback;
Query OK, 0 rows affected (0.00 sec) mysql> select * from t1;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 236 | 2 | a2 |
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
+-----+------+------+
10 rows in set (0.00 sec) rollback 结束一个事务,开启一个新的事务 mysql> commit;
Query OK, 0 rows affected (0.00 sec) mysql> select * from t1;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
+-----+------+------+
9 rows in set (0.00 sec) commit 结束一个事务,开启新的事务 Session 1:
mysql> select * from t1;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
+-----+------+------+
9 rows in set (0.00 sec) Session 2: 插入一条ID=99的记录 Session 1: mysql> delete from t1 where id=99;
Query OK, 1 row affected (0.00 sec) mysql> commit;
Query OK, 0 rows affected (0.01 sec) 你可以提高你的时间点通过提交你的事务, 然后做另外一个SELECT 或者 START TRANSACTION WITH CONSISTENT SNAPSHOT.
这被称为多版本并发控制 Session A Session B SET autocommit=0; SET autocommit=0;
time
| SELECT * FROM t;
| empty set
| INSERT INTO t VALUES (1, 2);
|
v SELECT * FROM t;
empty set
COMMIT; SELECT * FROM t;
empty set COMMIT; SELECT * FROM t;
---------------------
| 1 | 2 |
--------------------- 如果你像看到最新鲜的数据库状态,使用READ COMMITTED isolation level 或者locking read: SELECT * FROM t LOCK IN SHARE MODE; Session 1:
mysql> SELECT * FROM t1 LOCK IN SHARE MODE;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
+-----+------+------+
9 rows in set (0.00 sec) Session 2: mysql> insert into t1(id,info) values(20,'a20'); --Hang 在
READ COMMITTED 隔离级别下,每个一致性读读取它自己最新的快照。 Session 1:
mysql> select * from t1;
+-----+------+------+
| sn | id | info |
+-----+------+------+
| 237 | 3 | a3 |
| 238 | 4 | a4 |
| 239 | 5 | a5 |
| 240 | 6 | a6 |
| 241 | 7 | a7 |
| 242 | 8 | a8 |
| 243 | 9 | a9 |
| 244 | 10 | a10 |
| 245 | 15 | a15 |
| 247 | 20 | a20 |
+-----+------+------+
10 rows in set (0.00 sec) mysql> insert into t1(id,info) values(25,'a25');
Query OK, 1 row affected (22.22 sec) 事务没有提交 Session 2: mysql> SELECT * FROM t1 LOCK IN SHARE MODE;--Hang 在LOCK IN S HARE 模式下,一个locking read 发生。 一个SELECT 堵塞直到事务包含最新鲜的记录 一致性读不工作在某些DDL 语句: 1. 一致性读在DROP TABLE 不工作,因为MySQL 不能使用一个表已经被删除和InnoDB 摧毁这个表 关闭自动提交: Session 1: mysql> select * from t5;
+----+------+------+
| sn | id | info |
+----+------+------+
| 1 | 1 | a1 |
| 2 | 5 | a5 |
| 3 | 10 | a10 |
| 4 | 15 | a15 |
| 5 | 20 | a20 |
| 6 | 25 | a25 |
| 7 | 30 | a30 |
| 8 | 35 | a35 |
| 9 | 40 | a40 |
| 10 | 2 | a2 |
+----+------+------+
10 rows in set (0.00 sec) Session 2: mysql> drop table t5; --hang select 会堵塞DDL操作 一致读不能在ALTER TABLE时工作, 因为语句做了一个原表的临时拷贝,删除原始表 当临时copy 被创建。 当你重新发起一个一致性读 在一个事务内, 表里的记录是不可见的 因为那些记录不存在 当事务的快照被创建时

14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读的更多相关文章

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

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

  2. MySQL中一致性非锁定读

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

  3. MySQL一致性非锁定读

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

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

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

  5. 分布式理论(八)—— Consistent Hash(一致性哈希算法)

    前言 在分布式系统中,常常需要使用缓存,而且通常是集群,访问缓存和添加缓存都需要一个 hash 算法来寻找到合适的 Cache 节点.但,通常不是用取余hash,而是使用我们今天的主角-- 一致性 h ...

  6. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  7. MySQL 一致性读 深入研究

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

  8. MySQL 一致性读 深入研究 digdeep博客学习

    http://www.cnblogs.com/digdeep/p/4947694.html 一致性读,又称为快照读.使用的是MVCC机制读取undo中的已经提交的数据.所以它的读取是非阻塞的. 相关文 ...

  9. 14.3.2.1 Transaction Isolation Levels 事务隔离级别

    14.3.2 InnoDB Transaction Model InnoDB 事务模型 14.3.2.1 Transaction Isolation Levels 事务隔离级别 14.3.2.2 au ...

随机推荐

  1. Rfc2898DeriveBytes解密如何通过java实现

    原文 Rfc2898DeriveBytes解密如何通过java实现 这个找了半天,还是不太懂,密码一点不懂,直接上来问了 Rfc2898DeriveBytes对应的是PBKDF2WithHmacSHA ...

  2. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

  3. Docker学习笔记(4) — 开启Docker远程访问

    默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进程本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker ...

  4. Fix Windows 7 Msvcp71.dll And Msvcr71.dll Missing Error

    Fix Windows 7 Msvcp71.dll And Msvcr71.dll Missing Error Fix Msvcp71.dll And Msvcr71.dll Missing Erro ...

  5. excel通过转成xml格式模板,下载成excel文件

    源代码: report ztest_down_excel. data: begin of i_file occurs , val() type c, end of i_file. data begin ...

  6. ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

  7. 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度

    题目:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. 代码如下: #in ...

  8. CheckBox in ListView

    CheckBox in ListView Listview 在android中是经常用的组件,一些特殊情况下,系统提供的list view item 不够用, 不能满足需求,那么就需要自定义listV ...

  9. js下firstElementChild firstChild 以及childNodes和children方法

    一. <div> <p>123</p> </div> 在上面这段代码中,如果使用以下js代码 var oDiv=document.getElementB ...

  10. 编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功)

    编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功) ------by  wangsh 2012.02.22 Mapnik 是一个开源的 Python/C++ 地图渲染引 ...