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

【我和openGauss的故事】 对比 openGauss 5.0.0 和 PostgreSQL 15 事务相关语法

原创 秋秋 2023-07-14
613

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

pgloved.png

众所周知, 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;

ogtrx01.png

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;

ogtrx02.png

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;

ogtrx03.png

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;

ogtrx04.png

提交事务

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 特性,对此特性相关事务处理的内容将另行成文。

ogtrx05.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论