`
kabike
  • 浏览: 597390 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

innodb的mvcc和read view

阅读更多
最近读High Performance MySQL,里面提到了innodb事务隔离级别是REPEATABLE-READ时,有这样一段话
引用

SELECT
InnoDB must examine each row to ensure that it meets two criteria:
a. InnoDB must find a version of the row that is at least as old as the transaction
(i.e., its version must be less than or equal to the transaction’s version). This
ensures that either the row existed before the transaction began, or the trans-
action created or altered the row.
b. The row’s deletion version must be undefined or greater than the transaction’s
version. This ensures that the row wasn’t deleted before the transaction began.
Rows that pass both tests may be returned as the query’s result.

来验证一下
show create table 20130302t1;

 CREATE TABLE `20130302t1` (
  `id` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

表中有数据(1,1)
autocommit为false, tx_isolation 是REPEATABLE-READ
考虑以下两种情况
情况1
session Asession B
start transaction;(A)
start transaction
update 20130302t1 set b=2 where id=1;
commit;
select * from 20130302t1;(B)

B处结果为(1,2),似乎不符合那段话里的a条件,A事务看到了transaction version更大的B事务

情况2
session A     session B
                           start transaction
                          update 20130302t1 set b=2 where id=1;
start transaction
select * from 20130302t1;
                            commit;
select * from 20130302t1;(C)


C处结果为(1,1),也就是说,A事务没有看到transaction version更小的B事务

是不是那段话有问题呢,后来终于找到了官方的文档,innodb通过read view来确定一致性读时的数据库snapshot,innodb的read view确定一条记录能否看到,有两条法则
1 看不到read view创建时刻以后启动的事务
2 看不到read view创建时活跃的事务

引用
Rule 1: When the read view object is created it notes down the smallest transaction identifier that is not yet used as a transaction identifier (trx_sys_t::max_trx_id).   The read view calls it the low limit. So the transaction using the read view must not see any transaction with identifier greater than or equal to this low limit.

Rule 2: The transaction using the read view must not see a transaction that was active when the read view was created.


在情况1中,代码A处并没有创建read view,read view是在代码B处创建的.
如果把A处代码改为 START TRANSACTION WITH CONSISTENT SNAPSHOT;
才会创建read view,使得代码B返回(1,1)

在情况2中,B事务在A事务创建read view时处于ACTIVE状态,所以B事务不会被A事务看到.


这篇文章还提到了mysql5.6 在read only事务的优化,值得一看
1
3
分享到:
评论

相关推荐

    InnoDB事务-锁-MVCC

    InnoDB事务-锁-MVCC.pdf

    InnoDB引擎MVCC实现原理.pptx

    InnoDB引擎MVCC实现原理

    InnoDB中的MVCC

    什么是MVCC MVCC即Multi-Version Concurrency Control,译为多版本并发控制。 MVCC的背景 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制...

    InnoDB的多版本并发控制机制——MVCC

    InnoDB多版本并发控制机制MVCC的原理与实现,包括底层代码实现以及快照的构建原理。RR隔离级别和RC隔离级别的实现逻辑。

    MySQL InnoDB 源码实现分析

    MySQL InnoDB 源码实现分析

    MVCC-(Oracle-Innodb-Postgres)PPT课件.pptx

    MVCC-(Oracle-Innodb-Postgres)PPT课件.pptx

    Mysql innodb 存储引擎全揭秘

    Innodb 通过多版本并发控制(MVCC)来获得高并发性,并且实现了sql标准的4种隔离级别,默认为repeatable_read 级别。同时使用一种 -- next-key locking 的锁策略来避免幻读现象的产生,还提供了插入缓冲(insert ...

    MyISAM和InnoDB的异同

    MyISAM和InnoDB的异同 MyISAM和InnoDB的异同

    InnoDB-undo-log与MVCC1

    只过这些数据的历史版本是服务于
InnoDB
自身事务执需要的,并会永久的持久化并且我们可以随时查看某一个数据的历史版本另一个题外话,etcd
的设计和
MyS

    InnoDB怎么应对高并发

    总结 (1)常见并发控制保证数据一致性...(5)InnoDB是基于MVCC的存储引擎,它利用了存储在回滚段里的undo日志,即数据的旧版本,提高并发; (6)InnoDB之所以并发高,快照读不加锁; (7)InnoDB所有普通select都是快照读;

    MySQL 和 InnoDB 性能

    MySQL 和 InnoDB 性能

    InnoDB 中文参考手册

    InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 ...

    MyISAM引擎与InnoDB引擎性能的对比

    MyISAM引擎与InnoDB引擎性能的对比

    MySQL技术内幕 InnoDB存储引擎.pdf

    最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...

    Innodb 和 XtraDB 结构和性能优化

    Innodb 和 XtraDB 结构和性能优化 http://www.ossez.com/forum.php?mod=viewthread&tid=26839&fromuid=426 (出处: OSSEZ)

    mysql内核 innodb存储引擎

    内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制,并给出了大量最佳实践,能帮助你系统而深入地掌握InnoDB,更重要的是,它能为你设计和管理高性能、高可用的数据库系统提供绝佳的指导。...

    MySQL Innodb 索引原理详解

    MySQL Innodb 索引原理详解

    MySQL锁和事务、InnoDB架构分析.zip

    MySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析....

    MyISAM InnoDB 区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...

Global site tag (gtag.js) - Google Analytics