您的位置:首页 > 其它

MVCC (Multiversion Concurrency Control) 多并发版本控制

2018-03-15 20:40 357 查看
不同事物在同一时刻看到的数据可能是不同的(事务之间的隔离性),同一事物在不同时刻看到的数据一定是相同的(repeatable read)。我们首先会通过数据库的引擎保证这一点。

上面那句话我说的,不保证正确哈哈哈

MVCC并没有统一的标准,各个数据库实现均采用不同方式来实现MVCC,我们这里针对的是MySQL InnoDB的实现方式:

原理:

mvcc提供基于某个时间的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据,而不管这个事务执行的时间有多长,故在不同事务看来,同一时刻看到的相同的行数据可能是不一样的,即:每一行数据会有多个版本数据(副本)

InnoDB中每行隐含2个字段:

更新或修改版本号删除版本号(可以为空)

每一个事务开始也有自己的版本号且是递增

以select,delete,insert update语句来说明:

1. select 同时满足2个条件的行,才能被返回:

* 行的被修改版本号<=该版本号

* 行的被删除版本号要么没有被定义(此行为新增行,update也会产生新增行),要么大于当前事务的版本号:行的删除版本号如没被定义,说明行没有被删除过;如删除版本号>当前事务的版本号(不包括等于以保证不会读取到本事务删除的记录),说明该行的是被该事务的后面启动事务删除过(接着看下去..)

2. insert

插入记录的行标志设置为本事务版本号,删除标志为空;

3. delete

对于删除,innodb直接把该行的被删除版本号设置为当前事务版本号,相当于标记删除,不是实际删除

4. update

将原记录的删除版本号修改为本事务版本号;新插入一条记录,包含原记录数据及本次修改,行记录标志设置为本事务版本号,删除标志为空;

mvcc优缺点:

优点: 在读取数据时,innodb几乎不用获取任何锁,在每个查询通过版本检查,只获取需要的数据版本,提高系统并发度

缺点: 为了实现多版本,innodb必须对每行增加相应字段来存储版本信息,同时需要维护每一行的版本信息,而且在检索行的时候,需要进行版本的比较,因而减低了查询效率;innodb还需要定期清理不再需要的行版本,及时回收空间,这也增加开销;

关于删除版本号有点绕口,这里单独拿出来说一下。

为空或者删除版本号大于当前事务版本号。

为空这点想必不用过多解释,就说明这行没有被修改过

为什么大于当前事务版本号的可以被select出来呢? 因为小于等于的绝对不能被select出来 ,小于等于代表着之前事务或者本事务已经把这条带着版本号的记录删除了,自然这条数据就不应该被select出来。 大于的事务,那是未来的修改情况,你这个事务管不着,所以大于的情况就应该被select出来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: