14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读
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 一致性非锁定读的更多相关文章
- 14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读意味着 InnoDB 使用多版本来实现一个查询数据库的快照在某个时间点. 查看看到的事务做出的改变被提 ...
- MySQL中一致性非锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...
- MySQL一致性非锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...
- MySQL——一致性非锁定读(快照读)&MVCC
MySQL--一致性非锁定读(快照读) MySQL数据库中读分为一致性非锁定读.一致性锁定读 一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现. 一致性锁定读(当前读) ...
- 分布式理论(八)—— Consistent Hash(一致性哈希算法)
前言 在分布式系统中,常常需要使用缓存,而且通常是集群,访问缓存和添加缓存都需要一个 hash 算法来寻找到合适的 Cache 节点.但,通常不是用取余hash,而是使用我们今天的主角-- 一致性 h ...
- MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题
我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...
- MySQL 一致性读 深入研究
一致性读,又称为快照读.使用的是MVCC机制读取undo中的已经提交的数据.所以它的读取是非阻塞的. 相关文档:http://dev.mysql.com/doc/refman/5.6/en/innod ...
- MySQL 一致性读 深入研究 digdeep博客学习
http://www.cnblogs.com/digdeep/p/4947694.html 一致性读,又称为快照读.使用的是MVCC机制读取undo中的已经提交的数据.所以它的读取是非阻塞的. 相关文 ...
- 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 ...
随机推荐
- Robot Framework与Web界面自动化测试学习笔记:如何判断单选框的选中状态
单选按钮是个常见的html元素,在网页中往往提供一组单选按钮来做选项. 这样在自动化测试用例中需要判断当前选中的按钮是否与预期的一直. 可以这样来操作: ${value} Get Element ...
- GDSOI2015 task2 覆盖半径
题目大意 一个\(n\times m\)的矩阵中有\(p\)个已经确定圆心的圆,并且每个格子有一定的分数,如果一个格子被任意一个或以上的圆覆盖,那么就可以得到这个格子的分数.现在求最小的半径,使得得分 ...
- 分享一个获取代理ip的python函数
分享一个获取代理ip的python函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #coding:utf-8 from bs4 import Beaut ...
- 手动加入PE文件数字签名信息及格式具体解释图之下(历史代码,贴出学习)
#include <windows.h> HANDLE hWriteFileHandle = NULL ; HANDLE hReadFileHandle = NULL ; HANDLE h ...
- poj 3266 Cow School 分数规划
这个题目难度非常大,首先对于老师的一种方案,应用分数规划的一般做法,求出所有的c=t-rate*p,如果没有选择的c值中的最大值比选择了的c值中的最小值大,那么这个解是可以改进的. 那么问题就转化成了 ...
- Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)
解题报告 二分图第一题. 题目描写叙述: 为了參加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; ...
- Swift - 使用CABasicAnimation实现动画效果
1,CABasicAnimation类只有三个属性: fromValue:开始值 toValue:结束值 Duration:动画的时间 2,通过animationWithKeyPath键值对的方式设置 ...
- 我是小白之<%%>用法
下面知识都是摘录自网络 <%= %>输出,等价于Response.Write()<%%> 写代码<%-- --%>注释. <% %>跟其它serv ...
- [置顶] DX报表的开发流程(1)
DevExpress.XtraReports简称为DX报表. 本文主要介绍下VS2010项目中如何开发DX报表,具体的内容包括: (1)下载安装 (2)报表文件创建 (3)页面文件的创建 (4)页面的 ...
- error -27257: Pending web_reg_save_param/reg_find/create_html_param[_ex] request(s) detected and reset at the end of iteration number 1
检查点函数 web_reg_find("Search=body", "savecount=num", "Text=test1&quo ...