设为首页 加入收藏

TOP

MySQL 一致性读 深入研究(二)
2015-11-21 01:27:39 来源: 作者: 【 】 浏览:2
Tags:MySQL 一致性 深入 研究
mysql>?select?*?from?t1;
Empty?set?(0.00?sec)
?
?
mysql>?insert?into?t1(c1,c2)?values(1,1),(2,2);
mysql>?select?*?from?t1;
+----+------+
|?c1?|?c2???|
+----+------+
|??1?|????1?|
|??2?|????2?|
+----+------+
2?rows?in?set?(0.01?sec)
mysql>?select?*?from?t1;
Empty?set?(0.00?sec)
?
mysql>?update?t1?set?c2=100?where?c1=1;
Query?OK,?1?row?affected?(0.00?sec)
Rows?matched:?1??Changed:?1??Warnings:?0
?
mysql>?select?*?from?t1;
+----+------+
|?c1?|?c2???|
+----+------+
|??1?|??100?|
+----+------+
1?row?in?set?(0.00?sec)
?
?
该实验说明:本事务中进行修改的数据,即使没有提交,在本事务中的后面也可以读取到。update 语句因为进行的是“当前读”,所以它可以修改成功。
?
2)对于RC隔离就简单多了:
?
With READ COMMITTED isolation level, each consistent read within a transaction sets and reads its own fresh snapshot.
?
事务中每一次读取都是以当前的时间点作为判断是否提交的实际点,也即是 reads its own fresh snapshot.
?
RC是语句级多版本(事务的多条只读语句,创建不同的ReadView,代价更高),RR是事务级多版本(一个ReadView);
?
2. Oracle中的一致性读
?
Oracle读一致性是指一个查询所获得的数据来自同一时间点。
?
Oracle读一致性分为语句级读一致性和事务级读一致性。
?
语句级读一致性:Oracle强制实现语句级读一致性。一个查询语句只读取语句开始之前提交的数据。
?
事务级读一致性:隔离级别为SERIALIZABLE和read only的事务才支持事务级读一致性。事务中的所有查询语句只读取 事务开始之前提交的数据。
?
Oracle只实现了RC和serializable,没有实现Read uncommitted 和 RR。其实Oracle的serializable级别才实现了RR可重复读。
?
3. 当前读(current read) 和 一致性读
?
一致性读是指普通的select语句,不带 for update, in share mode 等等子句。使用的是undo中的提交的数据,不需要使用锁(MDL除外)。而当前读,是指update, delete, select for update, select in share mode等等语句进行的读,它们读取的是 数据库中的最新的数据,并且会锁住读取的行和gap(RR隔离时)。如果不能获得锁,则会一直等待,直到获得或者超时。
?
4. 一致性读与 mysqldump --single-transaction
?
我们知道 mysqldump --single-transaction的原理是:设置事务为RR模式,然后利用事务的特性,来获得一致性的数据,但是:
?
--single-transaction
? ? ? ? ? ? ? ? ? ? ? Creates a consistent snapshot by dumping all tables in a
? ? ? ? ? ? ? ? ? ? ? single transaction. Works ONLY for tables stored in
? ? ? ? ? ? ? ? ? ? ? storage engines which support multiversioning (currently
? ? ? ? ? ? ? ? ? ? ? only InnoDB does); the dump is NOT guaranteed to be
? ? ? ? ? ? ? ? ? ? ? consistent for other storage engines. While a
? ? ? ? ? ? ? ? ? ? ? --single-transaction dump is in process, to ensure a
? ? ? ? ? ? ? ? ? ? ? valid dump file (correct table contents and binary log
? ? ? ? ? ? ? ? ? ? ? position), no other connection should use the following
? ? ? ? ? ? ? ? ? ? ? statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
? ? ? ? ? ? ? ? ? ? ? TRUNCATE TABLE, as consistent snapshot is not isolated
? ? ? ? ? ? ? ? ? ? ? from them. Option automatically turns off --lock-tables.
?
在mysqldump运行期间,不能执行 alter table, drop table, rename table, truncate table 等等的DDL语句,因为一致性读和这些语句时无法隔离的。
?
那么在mysqldump --single-transaction 执行期间,执行了上面那些DDL,会发生什么呢?
?
mysqldump --single-transaction 的执行过程是:设置RR,然后开始事务,对应了一个LSN,然后对所有选中的表,一个一个的执行下面的过程:
?
save point sp; --> select * from t1 --> rollback to sp;
?
save point sp; --> select * from t2 --> rollback to sp;
?
... ...
?
1> 那么如果对t2表的DDL发生在 save point sp 之前,那么当mysqldump处理到 t2 表时,mysqldump 会立马报错:表结构已经改变......
?
2> 如果对t2表的DDL发生在 save point sp 之后,rollback to sp 之前,那么要么DDL被阻塞,要么mysqldump被阻塞,具体谁被阻塞,看谁先执行了。
?
? ? ?被阻塞额原因是:DDL需要t2表的 MDL 的互斥锁,而select * from t1 需要MDL的共享锁,所以阻塞发生。
?
3> 如果对t2表的DDL发生在 rollback to sp 之后,那么因为对 t2 表的dump已经完成,不会发生错误或者阻塞。
?
那么为什么: 对t2表的DDL发生在 save point sp 之前,那么当mysql
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MySQL分析服务器状态 下一篇MySQL死锁问题实例分析及解决方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: