子事物
子事物定义
在 AntDB 中,事务(Transaction)是执行一系列数据库操作的最小单位,它保证了操作的原子性、一致性、隔离性和持久性(ACID属性)。事务可以嵌套,也就是一个事务中可以包含另一个事务,这种事务被称为子事务。
子事务允许你在一个事务中执行多个操作,并在完成所有操作后提交或回滚整个事务。如果在子事务中的某个操作失败,整个父事务都会回滚,这样可以保证父事务的一致性。
在 AntDB 中,你可以使用 SAVEPOINT 语句在事务中创建一个保存点,然后回滚到这个保存点而不是整个事务。这样,只有子事务中的部分操作被回滚,而其他操作仍然保持有效。
集中式支持子事物
AntDB 集中式支持下述子事物相关操作。
SAVEPOINT
SAVEPOINT — 在当前事务中定义一个新的保存点
大纲
SAVEPOINT savepoint_name
描述
SAVEPOINT 在当前事务中建立一个新保存点。
保存点是事务内的一种特殊标记,它允许所有在它被建立之后执行的命令被 回滚,把该事务的状态恢复到它处于保存点时的样子。
参数
savepoint_name:给新保存点的名字。
注解
使用 ROLLBACK TO SAVEPOINT 回滚到一个保存点。 使用 RELEASE SAVEPOINT 销毁一个保存点, 但保持在它被建立之后执行的命令的效果。
保存点只能在一个事务块内建立。可以在一个事务内定义多个保存点。
示例
要建立一个保存点并且后来撤销在它建立之后执行的所有命令的效果:
CREATE TABLE table1(a int);
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
上面的事务将插入值 1 和 3,但不会插入 2。
要建立并且稍后销毁一个保存点:
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT my_savepoint;
COMMIT;
上面的事务将插入 3 和 4。
兼容性
当建立另一个同名保存点时,SQL 要求之前的那个保存点自动被销毁。在 AntDB 中,旧的保存点会被保留,不过在进行 回滚或释放时只能使用最近的那一个(用 RELEASE SAVEPOINT释放较新的保存点将会 导致较旧的保存点再次变得可以被 ROLLBACK TO SAVEPOINT和 RELEASE SAVEPOINT访问)。在其他方面, SAVEPOINT完全符合 SQL。
ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT — 回滚到一个保存点
大纲
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
描述
回滚在该保存点被建立之后执行的所有命令。该保存点保持有效并且可以在以后再次回滚到它(如果需要)。
ROLLBACK TO SAVEPOINT隐式地销毁在所提及的保存点之后建立的所有保存点。
参数
savepoint_name: 要回滚到的保存点。
注解
使用 RELEASE SAVEPOINT 销毁一个保存点而不抛弃在它建立之后被执行的命令的效果。
指定一个没有被建立的保存点是一种错误。
相对于保存点,游标有一点非事务的行为。在保存点被回滚时,任何在该保存点 内被打开的游标将会被关闭。如果一个先前打开的游标在一个保存点内被 FETCH或MOVE命令所影响,而该该保存点 后来又被回滚,那么该游标将保持FETCH使它指向的位置(也就是说由FETCH导致的游标动作不会被回滚)。回滚也不能 撤销关闭一个游标。不过,其他由游标查询导致的副作用(例如 被该查询所调用的易变函数的副作用) 可以被回滚,只要它们发生在一个后来被回滚的保存点期间。 如果一个游标的执行导致事务中止,它会被置于一种不能被执行的状态,这样当 事务被用ROLLBACK TO SAVEPOINT恢复后,该游标也不再能被使用。
示例
要撤销在my_savepoint建立后执行的命令的效果:
ROLLBACK TO SAVEPOINT my_savepoint;
游标位置不会受保存点回滚的影响:
BEGIN;
DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;
SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
----------
1
ROLLBACK TO SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
----------
2
COMMIT;
兼容性
SQL 标准指定关键词 SAVEPOINT是强制的,但是 AntDB 允许省略它。SQL 只允许WORK而不是TRANSACTION作为ROLLBACK之后的噪声词。 还有 SQL 有一个可选的子句 AND [ NO ] CHAIN,当前 AntDB 并不支持。在其他方面,这个命令符合 SQL 标准。
RELEASE SAVEPOINT
RELEASE SAVEPOINT — 销毁一个之前定义的保存点
大纲
RELEASE [ SAVEPOINT ] savepoint_name
描述
RELEASE SAVEPOINT销毁在当前事务中之前定义的一个保存点。
销毁一个保存点会使得它不能再作为一个回滚点,但是它没有其他用户 可见的行为。它不会撤销在该保存点被建立之后执行的命令的效果(要这样做,可见 ROLLBACK TO SAVEPOINT)。当不再需要一个保存点时销毁它允许系统在事务结束之前回收一些资源。
RELEASE SAVEPOINT也会销毁所有在该保存点建立之后建立的保存点。
参数
savepoint_name要销毁的保存点的名称。
注解
指定一个不是之前定义的保存点名称是错误。
当事务处于中止状态时不能释放保存点。
如果多个保存点具有相同的名称,只有最近被定义的那个会被释放。
示例
建立并且销毁一个保存点:
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT my_savepoint;
COMMIT;
上述事务将插入 3 和 4。
兼容性
这个命令符合 SQL 标准。该标准指定关键词 SAVEPOINT是强制需要的,但 AntDB 允许省略。




