关键字:
KingbaseES、自治事务、长事务、子事务、人大金仓
- 事务在数据库中是最小的操作执行单位,一个事务提交后,要么全部执行(commit),要么全部都不执行(rollback);
- KingbaseES数据库中,事务是默认自动开启的,即在执行单条sql语句时,会进入一个默认的事务环境中,sql语句执行成功后,事务也就完成;
- KingbaseES也可以手动开启和关闭事务,可以使用begin;命令或start transaction命令开启事务,使用end;或rollback命令关闭事务。
- 2. 自治事务
- 自治事务的定义
自治事务,顾名思义,自己管理自己的事务,它能够独立于其父事务提交或回滚。利用自治事务,可以挂起当前执行的事务,开启一个新事务,完成一些工作,然后提交或回滚,所有这些操作都不影响当前执行事务的状态。
只要开始执行,一个自治事务就完全独立于调用它的主事务。它看不到主事务的任何未提交的改变、不和主事务共享任何锁和资源。自治事务产生的改变在自身的提交之后就可以让其他事务看到。
- 自治事务的实现
语法:
只需要在PL/SQL的声明部分加上PRAGMA AUTONOMOUS_TRANSACTION即可:
如图所示,在程序块中声明自治事务后,程序块中的commit和rollback操作并不会影响到主事务,只会影响到该程序块中本身的事务;并且程序块中的子事务之间相互也不会有任何影响。
3. 子事务
- 子事务的概念
在KingbaseES中,事务是默认工作在自动提交模式下,这种模式只支持单语句的执行,在多语句的情况下,就需要显示的调用begin或者start transaction来开启一个事务,进行手动提交,最后使用end或者rollback命令来结束该事务。
在普通事务下,如果在执行多语句操作,某一步骤的sql语句出现了错误,那么只能使用rollback整个事务,然后从头开始整个事务;而子事务的出现可以解决这种问题,子事务允许用户回滚部分想要回滚的事务,也就是将一个完整的事务分割为多个子事务,当操作过程中出错或者不想执行某操作时,对事务中的子事务进行回滚操作即可,不需要对整个事务都进行回滚。
- 子事务的实现
在子事务中,不能直接对子事务进行提交,子事务也是通过事务的提交而提交,通过savepoint p1 在事务中打上保存点标记,将事务分割为多个子事务。
子事务在SQL语句中的使用:
SAVEPOINT savepoint_name
ROLLBACK [ WORK | TRANSACTION] TO [ SAVEPOINT ] savepoint_name
RELEASE [ SAVEPOINT ] savepoint_name
注意:
- Savepoints语句必须在事务块中;
- Savepoint执行保存点;rollback回滚到指定的保存点;release擦除保存点,不会回滚子事务数据;
- Cursor不会被savepoint事务影响
子事务示例:
4. 长事务
长事务是相对于短事务而言的,短事务一般执行的时间较短,但是在实际应用中,有些事务可能涉及到大量的数据和复杂的业务逻辑,执行的时间较长,这就是长事务。
短事务执行时间短,对数据库系统的性能影响较小,而长事务可能导致数据库锁定资源时间过长,从而影响系统的并发性能和响应速度。
长事务的定义依据是事务的执行时间超过一定的阈值,一般情况下可以根据数据库操作的复杂性和执行时间的长短来确定,比如,可以将超过5秒钟的事务定义为长事务。
构造大量数据,如:
对表test_001插入500W条数据,大量的数据插入会使得该事务的执行时间较长,因此,该事务可以被称为长事务;
除此之外,还可以手动构建长事务,比如,开启事务后,长时间内不对事务做commit或者rollback操作,会导致事务一直处于活跃状态中,这也能被称为长事务: