首页 > 其他分享 >【我和openGauss的故事】 openGauss 5.0.0 事务相关语法

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法

时间:2023-08-07 10:34:22浏览次数:33  
标签:5.0 事务 READ 语法 Session openGauss select row

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法

秋秋 openGauss 2023-08-03 16:49 发表于四川

众所周知, openGauss 是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,是 PostgreSQL 9.2.4 版本的硬分叉,经历 HUAWEI 多年的孵化,并已历经了两个 LTS 版本。

现在的 openGauss 5.0.0 正是第三个 LTS 版本,发行于 3 月 31 日,版本生命周期为三年。

openGauss 5.0.0 是流行的开源关系型数据库管理系统,它支持事务处理,下面我们来看看。

事务隔离级别

在 openGauss 5.0.0 中,支持 READ COMMITTED (读已提交)和 REPEATABLE READ (可重复读) 两种事务隔离级别。默认隔离级别是 READ COMMITTED (读已提交),保证不会读到脏数据。当事务使用此隔离级别时,SELECT查询(没有FOR UPDATE/SHARE子句)只能看到在查询开始之前提交的数据;它不会看到未提交的数据,也不会看到并发事务在查询执行期间提交的更改。事务可重复读隔离级别,事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前更新的执行结果,即使先前更新尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务,因为可能会发生串行化失败。 在 openGauss 中,目前功能上不支持 SERIALIZABLE 隔离级别,等价于REPEATABLE READ。

此外,在 openGauss 5.0.0 中,使用 全局事务管理器(Global Transaction Manager, GTM)来管理事务,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;

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法_隔离级别

使用 START 语句

openGauss 的语法为:

START TRANSACTION [ { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ];

演示实例:

START TRANSACTION isolation level repeatable read read WRITE;

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法_隔离级别_02

使用 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;

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法_隔离级别_03

提交事务

openGauss 的语法为:

{ COMMIT | END } [ WORK | TRANSACTION ] ;

回滚事务

当事务无法继续进行时,系统执行回滚,取消与该事务相关的所有已完成的数据库操作。

openGauss 的语法为:

ROLLBACK [ WORK | TRANSACTION ];

openGauss 事务验证实践

隐式提交案例一则

开启一个会话,尝试在事务显示开启时退出客户端,再次登入后查看数据是否插入成功,答案是否。

`openGauss=# begin;
BEGIN
openGauss=# insert into t select 2;
INSERT 0 1
openGauss=# select * from t;
id
1
2
(2 rows)

$ gsql
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type “help” for help.

openGauss=# select * from t;
id
1
(1 row)`

说明在事务中退出客户端,当前事务并不会隐式提交。

默认事务隔离级别 RC

openGauss 中默认事务提交级别 RC,下面做一个实验加以验证。

开启两个会话,Session A 和 Session B:

`-- Session A:
openGauss=# begin;
BEGIN
openGauss=# insert into t select 3;
INSERT 0 1
openGauss=# select * from t;
id
1
3
(2 rows)

– Session B:
openGauss=# begin;
BEGIN
openGauss=# select * from t;
id
1
(1 row)`

当前会话只能看到事务开始之前的 t 表数据。并且,Session B 无法读到未提交的数据,不存在脏读现象。

DDL 可回滚 – create table

在 openGauss 中,显式开启一个事务,然后执行 DDL 语句,那么这个 DDL 语句可以进行回滚,确认语句没有问题后,再进行显式提交。例如,在 Session A 中开启显式事务,并创建表 tr。

`-- Session A:
openGauss=# begin;
BEGIN
openGauss=# create table tr (id int);
CREATE TABLE
openGauss=# \dt
List of relations
Schema | Name | Type | Owner | Storage
--------±-----±------±------±---------------------------------
public | t | table | omm | {orientatinotallow=row,compressinotallow=no}
public | tr | table | omm | {orientatinotallow=row,compressinotallow=no}
(2 rows)

– Session B:
openGauss=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------±-----±------±------±---------------------------------
public | t | table | omm | {orientatinotallow=row,compressinotallow=no}
(1 row)

– Session A:
openGauss=# rollback;
ROLLBACK
openGauss=# \dt
List of relations
Schema | Name | Type | Owner | Storage
--------±-----±------±------±---------------------------------
public | t | table | omm | {orientatinotallow=row,compressinotallow=no}
(1 row)

– Session B:
openGauss=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------±-----±------±------±---------------------------------
public | t | table | omm | {orientatinotallow=row,compressinotallow=no}
(1 row)`

DDL 可回滚 – truncate table

同样地,在 openGauss 中,truncate table 也可以回滚。例如,清空表 t 的数据:

`-- Session A:
openGauss=# select * from t;
id
1
(1 row)

openGauss=# begin;
BEGIN
openGauss=# truncate table t;
TRUNCATE TABLE
openGauss=# select * from t;
id
(0 rows)

– Session B:
$ gsql
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type “help” for help.

openGauss=# select * from t;
id
1
(1 row)

openGauss=# select * from t;`

此时, Session A 中的 truncate 操作已经执行完成,可以看到事务中表中无数据,但是,Session B 再次去查询表 t 的数据时,事务会进入等待状态,直到 Session A 发出 commit/rollback 指令。

`-- Session A:
openGauss=# rollback;
ROLLBACK

openGauss=# select * from t;
id
1
(1 row)

– Session B:
openGauss=# select * from t;
id
1
(1 row)`

此外,由于 openGauss 引入了分布式事务,所以对于事务的处理复杂的多。

标签:5.0,事务,READ,语法,Session,openGauss,select,row
From: https://blog.51cto.com/u_16191492/6991259

相关文章

  • 【我和openGauss的故事】带有out参数的存储过程及自定义函数的重载测试
    【我和openGauss的故事】带有out参数的存储过程及自定义函数的重载测试DarkAthenaopenGauss2023-08-0418:01发表于四川背景先说下数据库里说的函数重载是什么。比如我们知道数据库可能会有同名的函数,但是函数的参数声明不一样selectto_char(sysdate,'yyyymmdd')fromdual;se......
  • 【我和openGauss的故事】使用Ora2Pg迁移oracle数据到openGauss
    【我和openGauss的故事】使用Ora2Pg迁移oracle数据到openGaussDemonCharm[openGauss](javascript:void(0);)2023-08-0418:01发表于四川前言本博客介绍了使用Ora2Pg迁移oracle数据到openGauss1、下载及安装Ora2Pg1.1、下载说明:PerlDBD:http://search.CPAN.org#只需在搜索......
  • 【我和openGauss的故事】为集群实现VIP
    【我和openGauss的故事】为集群增加VIPlqkittenopenGauss2023-08-0418:01发表于四川openGauss发布以来,原生支持一主多备,RTO<10S,高可用性能大大增强。自openGauss3.0开始,更新了集群管理套件CM,易用性也得到了提高。但对于客户端来说,数据库端的切换,需要手工完成。openGauss增加VI......
  • MTK 2.9.2 迁移Oracle 11g 至 openGauss 5.0.0操作指南
    MTK2.9.2迁移Oracle11g至openGauss5.0.0操作指南尚雷openGauss2023-08-0418:01发表于四川前言:最近在进行一些去O的验证测试,之前测试过MTK迁移Oracle到MogDB,正好测试下Oracle到openGauss的迁移,于是做了如下测试,并整理记录成文,还望对此熟悉的朋友多多指正。一、简介MTK全......
  • 【3.0】Vue之语法
    【一】插值语法<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><!--Vue文件--><scriptsrc="https://cdn.bootcdn.net/ajax/libs/vue/2.7.9/vu......
  • 【5.0】Vue之计算属性和监听属性
    【一】计算属性[1]计算属性是通过依赖变量进行缓存的,这意味着计算属性会保存最近一次计算的结果,并且只有在相关的依赖变量发生改变时才会重新计算。[2]计算属性只有在其相关依赖变量发生改变时才会重新求值,这也是它与普通函数的一个主要区别。与函数不同的是,计算属性只在......
  • Markdown语法总结
    markdown用的时间挺久了,但有时候有些不常用的语法还是得去查,好记性不如烂笔头,今天就总结下吧-标题用【#】处理#后面有空格#这是一级标题##这是二级标题###这是三级标题这是一级标题这是二级标题这是三级标题-字体用【*】和【~】处理**加粗***倾斜****斜体加粗......
  • Yaml语法
    世事变幻无常,而近乎永恒不变者,唯你我头上的同一片星空。Wherethereisnodesire,therewillbenoindustry.哪里没有欲望,哪里就不会有勤奋。一、YML是什么YAML(YAMLAintMarkupLanguage)是一种标记语言,通常以.yml或者.yaml为后缀的文件,是一种直观的能够被电脑识别的数......
  • Go 语法
    一个Go文件包含以下几个部分:包声明导入包函数语句和表达式看下面的代码,更好地理解它:例子packagemainimport"fmt"funcmain(){fmt.Println("HelloWorld!")}例子解释第1行:在Go中,每个程序都是一个包的一部分。我们使用package关键字来定义它。在这个......
  • Go 语法
    一个Go文件包含以下几个部分:包声明导入包函数语句和表达式看下面的代码,更好地理解它:例子packagemainimport"fmt"funcmain(){fmt.Println("HelloWorld!")}例子解释第1行:在Go中,每个程序都是一个包的一部分。我们使用package关键字来定义它。在这个例......