MatrixOne 的事务概述

什么是 MatrixOne 的事务?

MatrixOne 事务遵循数据库事务的标准定义与基本特征 (ACID)。它旨在帮助用户在分布式数据库环境下,确保每一次数据库数据操作行为,都能够令结果保证数据的一致性和完整性,在并发请求下互相隔离不受干扰。

MatrixOne 的事务类型

在 MatrixOne 中,事务与通用事务一样,也分为以下两大类:

  • 按照是否有明确的起止分为显式事务和隐式事务。
  • 按照对资源锁的使用阶段分为乐观事务和悲观事务。

这两大类事务的分类彼此不受对方限制,一个显式事务可以是乐观事务或悲观事务,同时一个悲观事务可能是显式事务也可能是隐式事务。

显式事务

在 MatrixOne 中,一个事务以 START TRANSACTION 显式声明,即成为一个显式事务。

隐式事务

在 MatrixOne 中,如果一个事务并没有通过 START TRANSACTIONBEGIN 来显式声明,那么为隐式事务。

乐观事务

在乐观事务开始时,会假定事务相关的表处于一个不会发生写冲突的状态,把对数据的插入、修改或删除缓存在内存中,在这一阶段不会对数据加锁,而在数据提交时对相应的数据表或数据行上锁,在完成提交后解锁。

悲观事务

MatrixOne 默认悲观事务。在悲观事务开始时,会假定事务相关的表处于一个会发生写冲突的状态,提前对相应的数据表或数据行上锁,完成上锁动作后,把对数据的插入、修改或删除缓存在内存中,在提交或回滚后,数据完成落盘并释放锁。

MatrixOne 的事务隔离级别

MatrixOne 支持读已提交(Read Committed)快照隔离两种隔离级别,默认隔离级别是读已提交(Read Committed)

读已提交

读已提交(Read Committed)是 MatrixOne 在 0.8 版本之后的默认隔离级别,也是 SQL 标准中的四个隔离级别之一。它最显著的特点是:

  • 在不同的事务之间,只能读到其他事务已经提交的数据,对于未提交状态的数据,无法查看。
  • 读已提交的隔离级别,能够有效防止脏写和脏读,但是不能避免不可重复读与幻读。
Isolation LevelP0 Dirty WriteP1 Dirty ReadP4C Cursor Lost UpdateP4 Lost Update
READ COMMITTEDNot PossibleNot PossiblePossiblePossible

快照隔离

与 SQL 标准所定义的四个隔离级别不同,在 MatrixOne 中,支持的隔离级别是快照隔离(Snapshot Isolation),该级别的隔离在 SQL-92 标准的 REPEATABLE READSERIALIZABLE 之间。与其他隔离级别有所区别的是,快照隔离具备如下特性:

  • 快照隔离对于指定事务内读取的数据不会反映其他同步的事务对数据所做的更改。指定事务使用本次事务开始时读取的数据行。

  • 读取数据时不会对数据进行锁定,因此快照事务不会阻止其他事务写入数据。

  • 写入数据的事务也不会阻止快照事务读取数据。

与其他隔离级别相比,快照隔离对于脏读 (读取未提交数据)、脏写(写了修改后未提交的记录)、幻读 (前后多次读取,数据总量不一致) 等场景也实现了有效回避:

Isolation LevelP0 Dirty WriteP1 Dirty ReadP4C Cursor Lost UpdateP4 Lost UpdateP2 Fuzzy ReadP3 PhantomA5A Read SkewA5B Write Skew
MatrixOne’s Snapshot IsolationNot PossibleNot PossibleNot PossibleNot PossibleNot PossibleNot PossibleNot PossiblePossible