目录

1. 什么是事务?

2. 事务的属性-ACID

3. 数据库事务的操作方式

3.1. SET TRANSACTION

3.2. BEGIN

3.3. COMMIT

3.4. ROLLBACK

3.5. SAVEPOINT

3.6. ROLLBACK TO SAVEPOINT

4. 事务的并发控制示例

5. 自治事务

5.1. 自治事务有如下重要的特性

5.1.1. 事务的独立性

5.1.2. 数据的可见性

5.1.3. 数据的关联性

5.2. 自治事务示例


1. 什么是事务?

事务(Transaction)指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

在关系数据库中,一个事务可以是一条 SQL 语句,一组 SQL 语句或整个程序。它将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。步骤之间的中间状态对于其他并发事务是不可见的,如果产生错误导致事务不能完成,则其中任何一个步骤都不会对数据库造成实质影响。

2. 事务的属性-ACID

  • 原子性(Atomicity)--事务的原子性强调了一个事务是一个逻辑工作单元,是一个整体,是不可分割的。一个事务所包含的操作要么全部做,要不全部不做。
  • 一致性(Consistency)-一个事务执行一项数据库操作,事务使数据库从一种一致性的状态变换成另一种一致性状态。
  • 隔离性(Isolation)-在事务未提交前,它操作的数据,对其他用户不可见。
  • 持久性(Durability)-一旦事务成功完成,该事务对数据库所施加的所有更新都是永久的。

3. 数据库事务的操作方式

3.1. SET TRANSACTION 

设置当前事务的特性

SET TRANSACTION 命令设置当前会话的事务特性,可用的事务特性包括事务隔离级别事务访问模式(读/写或只读)以及可延迟模式三类选项。

  • 事务隔离级别是指 一个事务的隔离级别决定当其他事务并行运行时该事务能看见什么数据,包括如下几个隔离级别:

READ COMMITTED 一个语句只能看到在它开始前提交的行。这是默认值。

REPEATABLE READ 当前事务的所有语句只能看到这个事务中执行的第一个查询或者数据修改语句之前提交的行。

SERIALIZABLE 当前事务的所有语句只能看到这个事务中执行的第一个查询或者数据修改语句之前提交的行。如果并发的可序列化事务间的读写模式可能导致一种那些事务串行(一次一个)执行时不可能出现的情况,其中之一将会被回滚并且得到一个serialization_failure 错误。

SQL 标准定义了一种额外的级别:READ UNCOMMITTED。在 KingbaseES 中 READ UNCOMMITTED 被视作 READ COMMITTED。

一个事务执行了第一个查询或者数据修改语句(SELECT、INSERT、DELETE、UPDATE、FETCH 或 COPY)之后就无法更改事务隔离级别。

  • 事务的访问模式决定该事务是否为读/写或者只读。读/写是默认值。
  • 可延迟模式   只有事务也是 SERIALIZABLE 以及 READ ONLY 时,DEFERRABLE 事务属性才会有效。

3.2. BEGIN

BEGIN —开始一个事务块。

也就是说所有 BEGIN 命令之后的所有语句将被在一个事务中执行,直到给出一个显式的COMMIT 或者ROLLBACK 。默认情况下(没有 BEGIN),KingbaseES 在“自动提交”模式中执行事务,也就是说每个语句都在自己的事务中执行并且在语句结束时隐式地执行一次提交(如果执行成功,否则会完成一次回滚)。

BEGIN也可以指定隔离级别、读/写模式或者延迟模式,其含义与SET TRANSACTION 相同。

3.3. COMMIT

COMMIT —提交当前事务。所有由该事务所作的更改会变得对他人可见并且被保证在崩溃发生时仍 能持久。

3.4. ROLLBACK

ROLLBACK —中止当前事务。

ROLLBACK 回滚当前事务并且导致该事务所作的所有更新都被抛弃。

3.5. SAVEPOINT

SAVEPOINT —在当前事务中定义一个新的保存点

保存点是事务内的一种特殊标记,它允许所有在它被建立之后执行的命令被回滚,把该事务的状态恢复到它处于保存点时的样子。

3.6. ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT —回滚到一个保存点

回滚在该保存点被建立之后执行的所有命令。

ROLLBACK TO SAVEPOINT 隐式地销毁在所提及的保存点之后建立的所有保存点。

4. 事务的并发控制示例

在一个保存着多个客户账户余额和支行总存款额的银行数据库中。如需记录一笔从 Alice 的账户到 Bob 的账户的额度为 100.00 美元的转账,SQL 命令为:


  1. UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; 
  2. UPDATE branches SET balance = balance - 100.00
  3. WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
  4. UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
  5. UPDATE branches SET balance = balance + 100.00
  6. WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');

在上述操作涉及到对数据库的多个独立更新,银行职员希望确保这些更新要么全部发生,或者全部不发生。不能出现由于系统错误导致 Bob 收到 100 美元而 Alice 并未被扣款的情况,或者 Alice被扣款而 Bob 未收到转账的情况。

因此,需要保证在操作中途发生错误时,已经执行的步骤不会产生效果。这就是事务的原子性(一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做)。

银行职员同样希望能保证一旦一个事务被数据库系统完成并认可,它就被永久地记录下来且即便其后发生崩溃也不会被丢失。例如,需要永久保留 Bob 的现金提款记录。

一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。当多个事务并发运行时,每一个事务都不能看到其他事务未完成的修改。 例如,如果一个事务为统计所有支行的余额,它不会只包括 Alice 的支行的扣款而不包括 Bob 的支行的存款,或者反之。

所以事务的全做或全不做并不只体现在它们对数据库的持久影响,也体现在它们发生

时的可见性。一个事务所做的更新在它完成之前对于其他事务是不可见的,而之后所有的更新将同时变得可见。

在 KingbaseES 中,使用 SQL 命令 BEGIN 和 COMMIT 开启一个事务:


  1. BEGIN;
  2. UPDATE accounts SET balance = balance - 100.00
  3. WHERE name = 'Alice';
  4. ...
  5. COMMIT;

在事务执行中若不想提交(若 Alice 的余额不足),可以以 ROLLBACK 命令代替 COMMIT 命令, 当前的更新即被取消。

可以利用保存点来以更细的粒度控制事务中的语句。保存点允许有选择性地放弃事务的一部分而提交剩下的部分。

例如:在银行数据库中,假设从 Alice 的账户扣款 100 美元,然后存款到 Bob 的账户,但直至最终才发现应该存在 Wally 的账户中。可以通过使用保存点来做这件事。


  1. BEGIN;
  2. UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
  3. SAVEPOINT my_savepoint;
  4. UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
  5. -- oops ... forget that and use Wally's account
  6. ROLLBACK TO my_savepoint;
  7. UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally';
  8. COMMIT;

ROLLBACK TO 是重新控制一个由于错误被系统置为中断状态的事务块的唯一的途径,而不是完全回滚它并重新启动。

5. 自治事务

包含自治事务的匿名块、存储过程和函数称之为自治程序。为便于说明,将调用自治程序的事务称之为主事务。自治事务是独立于主事务的事务,本质上也是事务。它以匿名块、存储过程和函数为载体,自治程序被执行时,它所包含的所有事务就称之为自治事务。

5.1. 自治事务有如下重要的特性

5.1.1. 事务的独立性

主事务和自治事务相互独立,各自的 TCL 操作互不影响,即主、自治事务的 commit/rollback 互不干涉。

如下示例:匿名块中的 rollback 不会回滚 proc1 中的 t2 语句,proc1 中的 commit 也不会提交主事务的 t1 语句:


  1. begin
  2. insert into test1 values (1); --t0
  3. commit;
  4. insert into test1 values (2); --t1
  5. proc1('this is my error message');
  6. rollback;
  7. end;
  8. /

5.1.2. 数据的可见性

a) 主事务或其他事务仅已提交的更改对自治事务可见

b) 自治事务中已提交的更改对主事务和其他事务可见

用 1 中的例子加以说明,主事务的 t1 语句未提交,对于 proc1 不可见,t0 语句已提交, 对 proc1 可见;同理,自治事务的 t2 语句被提交后对主事务可见。

5.1.3. 数据的关联性

a) 自治程序可接受主事务传递的参数

b) 自治程序可返回结果集

c) 自治事务异常可以被主事务捕获

d) 自治程序的打印等信息可直接被主事务接收,使用透明

e) 自治程序的 OUT 参数对主事务同样生效

5.2. 自治事务示例

包中存储过程、并传递参数


  1. create table accounts(account_id int, balance float);
  2. insert into accounts values (7715, 5000.5);
  3. CREATE OR REPLACE PACKAGE pac1 AS
  4. procedure f1(id int, n float);
  5. END;
  6. /
  7. CREATE OR REPLACE PACKAGE body pac1 AS
  8. procedure f1(id int, n float) as
  9. pragma autonomous_transaction;
  10. begin
  11. insert into accounts values (id, n);
  12. update accounts set balance = balance - 100 where account_id =id;
  13. commit;
  14. end;
  15. END;
  16. /
  17. BEGIN
  18. call pac1.f1(7720, 5680);
  19. rollback;
  20. END;
  21. /

关于事务的具体详细的使用细节请参考官方产品用户文档:

https://help.kingbase.com.cn

文章知识点与官方知识档案匹配,可进一步学习相关知识

[转帖]KingbaseES 事务总结的更多相关文章

  1. [转帖]分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...

  2. KingbaseES在线wal日志

    KingbaseES数据库日志文件记录数据库的历史操作信息, 包含恢复数据库中的所有事务所需的信息. KingbaseES在线WAL日志: WAL日志: 预写式日志(Write-Ahead Loggi ...

  3. KingbaseES应对表年龄增长过快导致事务回卷

    背景 前几天碰到这样一个场景,在KingbaseES数据库当作数据同步节点.其特点是接收过来的数据量巨大,其更新超级频繁,最大的数据库达到6TB.这还不是主要的,主要导致问题发生原因是同步数据库有很多 ...

  4. KingbaseES XA 分布式事务

    在分布式系统中,各个节点(或者事务参与方)之间在物理上相互独立,各节点之间无法确切地知道其它节点中的事务执行情况,所以多节点之间很难保证ACID,尤其是原子性.如果是单节点的事务,由于存在事务机制,可 ...

  5. [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST,  ...

  6. 【转帖】分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 ​ 博彦信息技术有限公司 java工程师 3. 分布式事务解决方案之2PC(两阶段提交 ...

  7. [转帖]深度剖析一站式分布式事务方案 Seata-Server

    深度剖析一站式分布式事务方案 Seata-Server https://www.jianshu.com/p/940e2cfab67e 金融级分布式架构关注 22019.04.10 16:59:14字数 ...

  8. [转帖]TPC-C解析系列04_TPC-C基准测试之数据库事务引擎的挑战

    TPC-C解析系列04_TPC-C基准测试之数据库事务引擎的挑战   http://www.itpub.net/2019/10/08/3331/ OceanBase这次TPC-C测试与榜单上Oracl ...

  9. [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?

    支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...

  10. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

随机推荐

  1. k8s卷管理-1

    目录 卷管理-1 1. 本地存储 1.1 emptyDir 1.2 hostPath 网络存储 搭建NFS服务器 使用NFS网络存储 搭建iSCSI服务器 使用iSCSI网络存储 卷管理-1 我们之前 ...

  2. MySQL进阶篇:详解SQL性能分析

    MySQL进阶篇:第三章_SQL性能分析 SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.通过如下指令,可以查 ...

  3. 用100W+行代码贡献经验,带你了解如何参与OpenHarmony开源

    摘要:截至2022年11月,深开鸿共计参与共建OpenAtom OpenHarmony(以下简称OpenHarmony)社区16个SIG,其中4个为深开鸿主导,并累计贡献代码量超过百万行. 本文分享自 ...

  4. APP搜索如何又快又准?

    摘要:搜索的概念深入人心,但做好一个体验绝佳的搜索服务并不是一件容易的事. 本文分享自华为云社区<云搜索服务在APP搜索场景的应用>,作者:写代码的贺大师 搜索无处不在,尤其是在移动互联的 ...

  5. 如何只用一个小时定制一个行业AI 模型?

    摘要:华为云通过ModelArts Pro提供更多的行业套件和工作流可以供用户直接使用,进一步降低AI行业落地难度,让传统企业客户无需掌握算法知识亦可实现自身业务与AI技术的融合. 去年,在华为开发者 ...

  6. 资源成本降低60%!火山引擎ByteHouse助力数字营销平台仟传网络降本增效

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近日,中国知名内容社交平台整合营销企业仟传网络与火山引擎ByteHouse达成合作.仟传网络将通过火山引擎By ...

  7. AI 0基础学习,数学名词解析

    AI学习过程中,常见的名词解析 中位数 将数据从小到大排序,奇数列,取中间值,偶数列,中间两个值的平均,可做为销售指标 众数 一组数据中,数值出现最多的那个.反映哪款产品,销量最好 平均数 比赛中,去 ...

  8. Linux 升级安装 Python 3

    百度飞桨 PaddlePaddle 2.4.0 => Python 3.7.4 PaddlePaddle 2.4.1+ => Python 3.9.0 下载 # 安装依赖 [root@lo ...

  9. Flask小知识集合

    全局变量g的使用 flask在上下文中提供了四种变量,分别是: 变量名 上下文 说明 current_app 应用上下文 当前激活程序的程序实例 g 应用上下文 处理请求时用作临时存储的对象.每次请求 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (180)-- 算法导论13.4 3题

    三.用go语言,在练习13.3-2 中,将关键字 41.38.31.12.19.8 连续插入一棵初始的空树中,从而得到一棵红黑树.请给出从该树中连续删除关键字 8.12.19.31.38.41 后的红 ...