在 Stack Overflow 5月的年度调研中,数据库领域,PostgreSQL跃居第一,成为最受欢迎的数据库。在所有受访者中,正在使用MySQL数据库的受访者,其中有12,824人想要学习PG。

众所周知, openGauss 是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,是 PostgreSQL 9.2.4 版本的硬分叉,经历 HUAWEI 多年的孵化,并已历经了两个 LTS 版本。
现在的 openGauss 5.0.0 正是第三个 LTS 版本,发行于 3 月 31 日,版本生命周期为三年。
openGauss 5.0.0 和 PostgreSQL 15 都是流行的开源关系型数据库管理系统,它们都支持事务处理,但在事务相关语法上存在一些异同。下面我们来进行比对看看。
事务隔离级别
在 openGauss 5.0.0 中,支持 READ COMMITTED (读已提交)和 REPEATABLE READ (可重复读) 两种事务隔离级别。 默认隔离级别是 READ COMMITTED (读已提交),保证不会读到脏数据。当事务使用此隔离级别时,SELECT查询(没有FOR UPDATE/SHARE子句)只能看到在查询开始之前提交的数据;它不会看到未提交的数据,也不会看到并发事务在查询执行期间提交的更改。事务可重复读隔离级别,事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前更新的执行结果,即使先前更新尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务,因为可能会发生串行化失败。
在 openGauss 中,目前功能上不支持 SERIALIZABLE 隔离级别,等价于REPEATABLE READ。
对于 PostgreSQL 15 的默认隔离级别也是 Read Committed。在PostgreSQL中,你可以请求四种标准事务隔离级别中的任何一种,但在内部只实现了三种不同的隔离级别,也就是说,PostgreSQL的Read Uncommitted模式的行为类似于Read Committed。
在PostgreSQL 9.1版本之前,对 Serializable 事务隔离级别的请求提供了与这里描述的完全相同的行为。为了保留原有的Serializable行为,现在应该请求 Repeatable Read。
此外,在 openGauss 5.0.0 中,使用 全局事务管理器(Global Transaction Manager, GTM)来管理事务,GTM 负责全局事务号的分发,事务提交时间戳的分发以及全局事务运行状态的登记。 而 PostgreSQL 15 使用自己的内部机制来管理事务,不需要 GTM。
事务管理命令
在 openGauss 5.0.0 中,可以使用以下命令来启动和提交事务:
使用 BEGIN 语句
openGauss 的语法为:
BEGIN [ WORK | TRANSACTION ]
[
{
ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ }
| { READ WRITE | READ ONLY }
} [, ...]
];
演示实例:
begin work isolation level repeatable read read only;

PostgreSQL 的语法为:
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
DEFERRABLE 是 PostgreSQL 语言扩展,是由于某些历史遗留问题而保留下来的。表示延期检查,即在事务结束时进行检查。
使用 START 语句
openGauss 的语法为:
START TRANSACTION
[
{
ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ }
| { READ WRITE | READ ONLY }
} [, ...]
];
演示实例:
START TRANSACTION isolation level repeatable read read WRITE;

PostgreSQL 的语法为:
START TRANSACTION [ transaction_mode [, ...] ]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
使用 SET 在事务中改变事务隔离级别
openGauss 的语法为:
{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION }
{ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ }
| { READ WRITE | READ ONLY } } [, ...];
演示实例:
SET LOCAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

PostgreSQL 的语法为:
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
演示实例:
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ DEFERRABLE;

提交事务
openGauss 的语法为:
{ COMMIT | END } [ WORK | TRANSACTION ] ;
PostgreSQL 的语法为:
COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]
回滚事务
当事务无法继续进行时,系统执行回滚,取消与该事务相关的所有已完成的数据库操作。
openGauss 的语法为:
ROLLBACK [ WORK | TRANSACTION ];
PostgreSQL 的语法为:
ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]
The End
总的来说,虽然 openGauss 5.0.0 和 PostgreSQL 15 都支持事务处理,但它们在事务相关语法和隔离级别的实现上存在一些差异。因此,在使用这两个数据库管理系统时,需要注意这些差异,以确保正确地使用事务处理。
彩蛋,这里并没有提及 openGauss 的 MOT 特性,对此特性相关事务处理的内容将另行成文。





