12.1.3 事务的保存点
在事务中可以根据自己的需要设置保存点。保存点可以设置在事务中的任何地方,也可以设置多个点,这样就可以把比较长的事务根据需要分成较小的段,这样做的好处是当对数据的操作出现问题时可以不用全部回滚,只需要回滚到保存点处即可。例如,在一个事务内前十段数据操作确认准确,而后面的操作没有办法确认,开发人员就可以在第十段操作结束后设置保存点,这样即便后面的操作有错误,开发人员也可以利用保存点回滚到第十段处,而不用从头写。
一旦把事务回滚到某个保存点后,Oracle将把保存点之后持有的锁释放掉,这时先前等待被锁资源的事务就可以继续了。而使事务回滚到保存点,有下列几点需要了解:
❑事务只回滚保存点之后的操作。
❑回滚到某保存点时,它以后的保存点将被删除,但保存点会被保留。
❑保存点之后的锁将被释放,但之前的会被保留。
保存点使用起来非常方便,只需一行脚本就能完成。下面利用示例2演示事务中如何使用保存点。
【示例2】在事务中使用保存点
在事务中使用保存点,该示例分为如下5个步骤:
1)向PRODUCTINFO表增加一条数据,脚本如下,此时隐式事务已经打开。
INSERT INTO PRODUCTINFO VALUES('1','保存点测试1',1000,0,0000000000,NULL,'测试');
2)执行如下脚本,用于创建保存点,名为FST。
SAVEPOINT FST;
如果保存点创建成功,则有以下提示:
保存点已创建
3)当保存点创建完成后,继续向PRODUCTINFO表增加一条数据。脚本如下:
INSERT INTO PRODUCTINFO VALUES('2','保存点测试2',1000,0,0000000000,NULL,'测试');
4)以上三步按顺序创建完成后,查看PRODUCTINFO表数据,如图12.4所示。
图 12.4 未提交事务查询结果
图12.4中两处标示即为增加的数据。
5)回滚到保存点,执行如下脚本,并验证数据。执行过程如图12.5所示。
ROLLBACK TO FST;
图 12.5 回滚到保存点处数据
从图12.5中可以看出,事务已经成功回滚到保存点处。相信读者看了该示例后对保存点的使用已经没有问题,但笔者建议不要过分依赖保存点,而应尽量把长的事务改成较短的事务操作。