关键字:
KingbaseES、transaction、事务、人大金仓
什么是事务?
事务(Transaction)指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
在关系数据库中,一个事务可以是一条 SQL 语句,一组 SQL 语句或整个程序。它将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。步骤之间的中间状态对于其他并发事务是不可见的,如果产生错误导致事务不能完成,则其中任何一个步骤都不会对数据库造成实质影响。
注意:一个事务中的语句要么全部执行,要么全不执行。
事务的基本流程例子
下面就是一个转账事务的流程。由账户id为2001的人,将1000转给账户id为2101的人,在这个过程就是一个简单的事务,在这个简单的事务中,一旦事务开始就必须要两个账户全部更新完才能结束。如果中途出现问题,就会回滚。
没有执行存储过程之前的结果:
执行之后的结果。
事务控制语句
3.1 BEGIN
BEGIN — 开始一个事务块。
也就是说所有 BEGIN 命令之后的所有语句将被在一个主事务中执行,直到给出一个显式的COMMIT 或者ROLLBACK 。默认情况下(没有 BEGIN),KingbaseES 在“自动提交”模式中执行事务,也就是说每个语句都在自己的事务中执行并且在语句结束时隐式地执行一次提交(要么执行成功,否则会完成一次回滚)。
- COMMIT
COMMIT — 提交当前事务。所有由该事务所作的更改会变得对他人可见并且被保证在崩溃发生时仍能持久。 (即使在后面的运行中遇到了回滚,被commit的语句也不会被回滚了)
Commit语法:
COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]
用法1:
commit; -- 提交当前事务并且让所有更改持久化
用法2:
commit and chain
在commit后面指定and chain 从而直接连接到启动新的事务
3.3 ROLLBACK语句
ROLLBACK语句结束当前事务并撤销在该事务期间所做的任何更改。
ROLLBACK语法:
ROLLBACK;
ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]
语义:WORK | TRANSACTION为可选关键词,没有什么效果,选择哪个或者不选都一样。
AND CHAIN如果指定了AND CHAIN,则立即启动具有与刚刚完成的事务相同的事务特征的新事务,不然经不会启动任何事务。
在想要让事务回滚的地方触发ROLLBACK;这个语句,就会将该事务中所有的操作回滚,不管此事务中有没有出现报错,如下图所示:
该例子中并没有出现报错,但是在insert两条数据后,执行了ROLLBACK语句从而导致本来已经挂起的insert语句被回滚了。
ROLLBACK — 中止当前事务。
ROLLBACK 回滚当前事务并且导致该事务所作的所有更新都被抛弃。
- SAVEPOINT
SAVEPOINT — 在当前事务中定义一个新的保存点
保存点是事务内的一种特殊标记,它允许所有在它被建立之后执行的命令被回滚,把该事务的状态恢复到它处于保存点时的样子。
SAVEPOINT语法:
SAVEPOINT savepoint_name;
- ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT — 回滚到一个指定保存点
回滚在该保存点被建立之后执行的所有命令。
ROLLBACK TO SAVEPOINT 隐式地销毁在所提及的保存点之后建立的所有保存点。
示例:该示例中的2被回滚了,只插入了1和3
SET TRANSACTION语句
可以使用SET TRANSACTION语句实现只读事务,在只读事务期间,所有查询都引用数据库的同一个快照,提供多表、多查询、读一致的视图。其他用户可以像往常一样继续查询或更新数据。
SET TRANSACTION语句必须是只读事务中的第一条SQL语句,并且在事务中只能出现一次。如果您将事务设置为READ ONLY,则后续查询只会看到在事务开始之前提交的更改。READ ONLY的使用不会影响其他用户或事务。
使用只读事务中的SET TRANSACTION语句来收集学生表中得分70以上、80以上和90以上的学生的个数。




