oracle的mvcc解析,PostgreSQL原理:Oracle 和 MySQL 中MVCC机制详解
MVCC(多版本并发控制)提高数据库并发读写能力,常见于Oracle、MySQL和PostgreSQL。Oracle基于块级,利用UNDO/回滚段;MySQL在InnoDB引擎中也用undo段,但基于记录级;PostgreSQL不依赖undo,通过在数据行中保存多个版本实现。三种数据库各有特点,适应不同场景。MVCC,Multi-version Concurrency Control ,顾名思义指的是多版本并发控制。在介绍MVCC之前我们先来简单了解下事务的隔离级别:
read uncommitted:脏读,一个事务可以读到另外一个事务未提交的数据,大多数关系型数据库不支持。
read committed:提交读,一个事务可以读到其他事务已经提交的数据,大多数数据库的缺省模式。
repeatable read:一个事务执行过程中访问的数据是一致的,也就是一个事务中多次读到的数据不会变化。
serializable:序列化,事务串行化执行,避免不一致。代价很大,OLTP系统中很少使用。
在大多数关系型数据库中默认的事务隔离级别都是read committed(mysql中默认是repeatable read)。也可以根据业务场景的需要去选择合适的隔离级别,例如在一个事务中,使用select for update来避免读到不一致的数据,如果不是为了排他性的锁定,用RR事务隔离级别来代替可以获得更好的性能。
常见的并发控制有:
MVCC:Multi-version Concurrency Control (多版本并发控制)。
S2PL: Strict Two-Phase Locking(严格二阶段锁):读写互斥,保证串行。
OCC:Optimistic Concurrency
Control(乐观并发控制):和悲观锁不同,乐观锁在提交前不加锁,提交时如果读取时的数据被其他事务修改并提交,则回退事务。
简单来说,在MVCC机制还没有出现之前,数据库中读写是互斥的,而通过MVCC机制使得读写不互斥。因此MVCC使关系型数据库并发读写能力得到很大的提高,而大多数OLTP系统中的85%以上是读操作。
Oracle的MVCC实现方式
Oracle的多版本并发控制是基于块级的,利用Oracle UNDO/回滚段机制。在回滚段中保存了某个数据被修改之前的前映像的数据。
当我们在数据中查询之前版本的数据时






最低0.47元/天 解锁文章















773

















