pl/sql savepoint的使用

保存点(savepoint)是事务处理过程中的一个标志,和回滚命令(rollback)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在pl/sql研发中还是非常有用处的。

下面的例子中,把savepoint标记在insert语句之前,如果这条insert语句试图将重复的数据保存到emp表中的话,将触发执行预先定义的dup_val_on_index例外处理,在这里面的rollback to do_insert命令将回滚上面的那条insert操作,而不会影响前面的所有操作。

declare

emp_id emp.empno%type;

begin

update emp set ... where empno = emp_id;

delete from emp where ...

...

savepoint do_insert;

insert into emp values (emp_id, ...);

exception

when dup_val_on_index then

rollback to do_insert;

end;

如果你定义了多个savepoint,当你指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了n个savepoint)。例如,在一段处理中

你定义了五个savepoint,从第三个savepoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用rollback to savepoint_name而使用rollback,将会滚整个事务处理。

如果你在递归子程式里面定义了一个savepoint, 如果每一个递归层都设置了savepoint. 此时, 你只能回滚到最近的一个savepoint.

savepoint的声明能在同一个事务处理里面重复定义. 他的作用就是把savepoint从上一个位置转移到目前的位置. 因而,执行回滚也只回滚到最近的savepoint.

下面是个例子:

begin

...

savepoint my_point;

update emp set ... where empno = emp_id;

...

savepoint my_point; -- move my_point to current point

insert into emp values (emp_id, ...);

exception

when others then

rollback to my_point;

end;

另外,oracle没有对每个session里面能使用的savepoint个数做限制.

相关推荐
小光学长23 分钟前
基于ssm的膳食健康管理系统e6whl4q7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm
一个天蝎座 白勺 程序猿30 分钟前
KingbaseES融合数据库:一库多能,企业数据管理新思路
数据库·性能优化·kingbasees·金仓数据库
橘颂TA40 分钟前
【MySQL】解锁表的 N 种牵手方式:SQL 连接与子查询漫游(复合查询)
数据库·mysql
数据知道1 小时前
MongoDB基于角色的访问控制(RBAC):精细化权限管理的实用方法
数据库·mongodb
代码派1 小时前
NineData社区版:免费+本地化部署,满足数据库DevOps、数据复制与一致性对比的数据库管理平台
运维·数据库·database·devops·数据库管理工具·ninedata·数据库迁移
jarvisuni1 小时前
GLM5实战测试,挑战Opus4.6 !
前端·数据库
wyt5314291 小时前
基于人脸识别和 MySQL 的考勤管理系统实现
数据库·mysql
数据知道1 小时前
MongoDB分片键选择策略:决定数据分布与查询性能的关键因素
数据库·mongodb
smchaopiao2 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
baivfhpwxf20232 小时前
ACS X轴回零程序 项目实战版
网络·数据库·算法