openGauss学习笔记-37 openGauss 高级数据管理-事务

openGauss学习笔记-37 openGauss 高级数据管理-事务37.1 语法格式37.2 参数说明37.3 示例

openGauss学习笔记-37 openGauss 高级数据管理-事务

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。openGauss数据库支持的事务控制命令有启动、设置、提交、回滚事务。openGauss数据库支持的事务隔离级别有读已提交和可重复读。

  • READ COMMITTED:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。

    实际上,SELECT查询会查看到在查询开始运行的瞬间该数据库的一个快照。不过,SELECT能查看到其自身所在事务中先前更新的执行结果。即使先前更新尚未提交。请注意,在同一个事务里两个相邻的SELECT命令可能会查看到不同的快照,因为其它事务会在第一个SELECT执行期间提交。

    因为在读已提交模式里,每个新的命令都是从一个新的快照开始的,而这个快照包含所有到该时刻为止已提交的事务,因此同一事务中后面的命令将看到任何已提交的其它事务的效果。这里关心的问题是在单个命令里是否看到数据库里绝对一致的视图。

    读已提交模式提供的部分事务隔离对于许多应用而言是足够的,并且这个模式速度快,使用简单。不过,对于做复杂查询和更新的应用,可能需要保证数据库有比读已提交模式更加严格的一致性视图。

  • REPEATABLE READ:事务可重复读隔离级别,事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前更新的执行结果,即使先前更新尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务,因为可能会发生串行化失败。

37.1 语法格式

  • 启动事务

    使用BEGIN语法启动事务。

BEGIN [ WORK | TRANSACTION ]
     [ 
     { 
     ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ }
     | { READ WRITE | READ ONLY }
     } [, ...] 
     ];
使用START TRANSACTION启动事务。
START TRANSACTION
     [ 
     { 
     ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ }
     | { READ WRITE | READ ONLY }
     } [, ...] 
     ];
  • 设置事务特性

    用户可以使用SET TRANSACTION或语法设置事务的隔离级别、读写模式。

{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION }
     { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ }
     | { READ WRITE | READ ONLY } } [, ...];
  • 提交事务

    用户可以使用COMMIT或者END完成提交事务的功能,即提交事务的所有操作。

{ COMMIT | END } [ WORK | TRANSACTION ] ;
  • 回滚事务

    回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。

ROLLBACK [ WORK | TRANSACTION ];

37.2 参数说明

  • WORK | TRANSACTION

    BEGIN格式中的可选关键字,没有实际作用。

  • ISOLATION LEVEL

    指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。

    [图片上传失败...(image-4082ba-1691748964529)]

    说明: 在事务中第一个数据修改语句(SELECT, INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。

    取值范围:

    • READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。

    • REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。

    • SERIALIZABLE:目前功能上不支持此隔离级别,等价于REPEATABLE READ。

  • READ WRITE | READ ONLY

    指定事务访问模式(读/写或者只读)。

  • LOCAL

    声明该命令只在当前事务中有效。

  • SESSION

    声明这个命令只对当前会话起作用。

    取值范围:字符串,要符合标识符的命名规范。

  • COMMIT | END

    提交当前事务,让所有当前事务的更改为其他事务可见。

37.3 示例

假设存在表customer_t1 ,数据内容如下:

openGauss=# SELECT * FROM customer_t1;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
 3769 | hello         | Grace        |             |   1000
 3769 |               | Grace        |             |
 3769 | hello         |              |             |
 6885 | maps          | Joes         |             |   2200
 4321 | tpcds         | Lily         |             |   3000
 9527 | world         | James        |             |   5000
(6 rows)

开启一个事务,并从表中删除amount为1000的行,最后使用ROLLBACK命令撤销所有的更改。

openGauss=# START TRANSACTION;
openGauss=# DELETE FROM customer_t1 WHERE amount = 1000;
openGauss=# ROLLBACK;

查看表customer_t1,amount为1000的行仍然存在。

openGauss=# select * from customer_t1;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
 3769 | hello         | Grace        |             |   1000
 3769 |               | Grace        |             |
 3769 | hello         |              |             |
 6885 | maps          | Joes         |             |   2200
 4321 | tpcds         | Lily         |             |   3000
 9527 | world         | James        |             |   5000
(6 rows)

开始另一个事务,从表中删除amount=1000的记录,最后使用COMMIT命令提交所有的更改。

--开启一个事务,设置事务的隔离级别为READ COMMITTED,访问模式为READ ONLY。
openGauss=# BEGIN;
openGauss=# DELETE FROM customer_t1 WHERE amount = 1000;
openGauss=# COMMIT;

查询表customer_t1,amount=1000的记录已经被删除。

openGauss=# select * from customer_t1;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
 3769 |               | Grace        |             |
 3769 | hello         |              |             |
 6885 | maps          | Joes         |             |   2200
 4321 | tpcds         | Lily         |             |   3000
 9527 | world         | James        |             |   5000
(5 rows)

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容