暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

10 | 从乐观的思路(OCC、MVCC)来看并发控制的技术实现

新架构思考 2021-09-05
2666


你好,我是于文涛,回顾一下,在上一讲中,我们先详细介绍了锁有关的知识,接着介绍了二阶段锁协议(2PL)及其变种协议(S2PL、SS2PL),最后讲了现有的主流数据库产品都是基于强两阶段锁(SS2PL)来实现事务的并发控制的。

 

在本讲中,我们会对除锁之外的其他几种并发控制技术的实现进行详细的介绍。

并发控制技术实现有哪些实现思路呢?

并发控制的技术总共有如下几种实现思路:

  1. 悲观思路,悲观并发控制技术,简称PCC (Pessimistic Concurrency Control),包括:两阶段锁(2PL)及其变种协议(S2PL和SS2PL)。

2PL及其变种协议是一种悲观的思路,体现在:假设事务一定会发生非冲突可串行化,一定会出现异常,因此需要提前利用加锁、解锁的策略来预防,避免后续事务的读写操作进入到非可串行化状态中,这就是悲观的思路。

当一个事务给数据元素加上锁之后,其他的事务要想修改该数据,就只能等待锁的释放,除此之外没有别的办法,这虽然保证了结果的正确性,同时也降低了执行效率。

 

  1. 乐观思路,乐观并发控制技术,简称OCC(Optimistic Concurrency Control),包括:时间戳排序(Timestamp ordering)的并发控制、有效性确认的并发控制。

乐观的思路,跟悲观的思路区别是:假设事务执行过程中,在绝大部分情况下都能保证可串行化,都能正常执行、获取正确的结果,因此也就不需要提前加锁来预防。

在少数情况下,如果发生冲突,通过撤回发生冲突事务的方式来解决,这样能提高整体的执行效率。显然该思路在并发冲突少、性能要求高的场景下,有着显著的优势。

 

  1. 读写分离思路,多版本并发控制技术,简称MVCC(Multi-Version Concurrency Control)

 

基于读写分离的思路的多版本并发控制技术,目前在各种数据库产品中有大量的应用,比如Mysql的Innodb存储引擎,以及PostgreSQL,比如分布式数据库TiDB,OceanBase等。

下面我们重点介绍一下这部分内容:

多版本并发控制(MVCC)是什么?

这是近十多年来在数据库管理系统领域中最流行的并发控制方法,可以保证读和写不会相互阻塞,只有写和写会产生阻塞。多版本并发控制之所以流行的原因是因为大多数的场景下都是读多写少,因此,写与写的操作冲突概率很少。这样,就可以在保证结果正确性的前提下,能大大提高事务执行的并发度。

 

多版本是指,在数据库中的数据项被修改并提交后,都会生成一个新的版本值,比如经过n次修改并成功提交,数据X会存在一个版本集合{X1,X2,X3,...Xn}。每个事务启动时候都会被分配一个正向增长的事务ID,每一次事务读取的都是旧的已经提交的版本,最新未提交的新版本的数据是无法读取的。

 

 

参考论文<An Empirical Evaluation of In-Memory MVCC>:

The most popular scheme used in DBMSs developed

in the last decade is multi-version concurrency control (MVCC). 

The basic idea of MVCC is that the DBMS maintains multiple physical

versions of each logical object in the database to allow operations on

the same object to proceed in parallel. .....

Multi-versioning allows read-only transactions

to access older versions of tuples without preventing read-write

transactions from simultaneously generating newer versions.

什么是快照隔离(SI)和可序列化快照隔离(SSI)?

回顾一下之前的<04 | Spring 中的事务隔离级别和传播机制>章节中讲过ANSI SQL定义的四种隔离级别:读未提交、读已提交、可重复读和可串行化,其中并没有快照隔离(Snapshot Isolation)和可序列化快照隔离(Serializable Snapshot Isolation)。这是因为早期在定义四种隔离级别时候,主要是基于锁的方式来实现的,对快照隔离技术认识不够深入,随着后续发展,SI和SSI重要性逐步增大,并且也认识的更加充分。SI和SSI已经成为现今主流的分布式数据库中的主流应用技术。比如之前介绍过的CockroachDB中就支持这两种技术。实际上多版本并发控制技术只是一个笼统的说法,SI和SSI可以看成是多版本并发控制(MVCC)这类技术的具体实现方式。

SI和SSI有时也称为隔离级别,是因为标准的ANSI SQL 92中定义的隔离级别并不能覆盖所有的隔离级别,而SI和SSI又确实避免了ANSI SQL92标准中定义的三种异常现象(脏读、不可重复读、幻读),但是它并没有达到可串行化的隔离级别,因此可以认为SI和SSI是介于可重复读隔离级别和可串行化隔离级别之间的隔离级别。

 

InnoDB 的 MVCC 是如何工作的?

InnoDB在不同的隔离级别(RC和RR)下,MVCC是怎样工作的?

 

InnoDB中数据库的读操作分为两种,一致性锁定读和一致性读(consistent read)

一致性读

 

划重点,两者区别在于ReadView 的产生的时间点是不同的:

隔离级别

ReadView的不同点

可重复读(Repeatable Read)

可重复读 中,当前事务查询时生成的ReadView,在该事务提交前会一直保留,后面如果有多次读操作,也都会使用之前第一次读时生成的ReadView,这样就可以保证期间其他事务提交的数据不会被当前事务看见,也就保证了该事务的多次读取的数据是一致的。

已提交读(Read Commited)

 

已提交读 中每次新的查询都会生成一个新的ReadView,这样其他新的事务有新提交后,能够保证这次新提交后的数据对于当前查询的事务而言是可见的状态。

并发控制技术总结

 

 

 

 

 

相关文章推荐:


开篇词:如何实现自我基础设施新重建-从掌握一致性与分布式事务开始

导读 | 从单体到服务网格的系统架构演进之路

01 | 分布式事务及常见的解决方案

02 | 深入剖析事务的本质及其 ACID 特性

03 | 汇总分析 5 种常见数据读写异常

04 | Spring 中的事务隔离级别和传播机制

09 | 概念辨析:分布式系统中的一致性和ACID中一致性概念异同

文章转载自新架构思考,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论