Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4958517
  • 博文数量: 1696
  • 博客积分: 10870
  • 博客等级: 上将
  • 技术积分: 18357
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-30 15:16
文章分类
文章存档

2017年(1)

2016年(1)

2015年(1)

2013年(1)

2012年(43)

2011年(17)

2010年(828)

2009年(568)

2008年(185)

2007年(51)

分类: Oracle

2009-09-08 01:33:04

3.2 使用SAVEPOINT(2)

2. ROLLBACK

当ROLLBACK 语句提交到数据库时,这个事务就结束了,并且会出现如下结果:

该事务所做的所有工作被撤销,就像没有执行过这个事务一样。

该事务拥有的所有锁被释放。ROLLBACK 语句的语法如下所示:

 

单词WORK 是可选的,使用它的目的是改进代码的可读性。

3. SAVEPOINT

ROLLBACK 语句会撤销用户在特定事务中所做的所有工作。但是,使用SAVEPOINT 命令,可以实现只有事务的部分工作被撤销。SAVEPOINT 命令的语法如下所示:

单词name 是SAVEPOINT 的名称。一旦定义SAVEPOINT,程序就只能回滚到这个SAVEPOINT 。ROLLBACK 语句的语法如下所示:

 

单词WORK 是可选的,使用它的目的是改进代码的可读性。

3. SAVEPOINT

ROLLBACK 语句会撤销用户在特定事务中所做的所有工作。但是,使用SAVEPOINT 命令,可以实现只有事务的部分工作被撤销。SAVEPOINT 命令的语法如下所示:

单词name 是SAVEPOINT 的名称。一旦定义SAVEPOINT,程序就只能回滚到这个SAVEPOINT 。ROLLBACK 语句的语法如下所示:

当ROLLBACK to SAVEPOINT 提交到数据库时,就会出现如下结果:

从SAVEPOINT 起的所有工作被撤销。但是,SAVEPOINT 仍是活跃的,直到执行完全的COMMIT 或者ROLLBACK 。在需要时,可以再次回滚。

从SAVEPOINT 以来SQL 语句所拥有的所有锁和资源被释放。

事务没有结束,因为SQL 语句还没有最终结束。

试验3.2练习

这部分提供有关PL/SQL 的练习和建议答案,以及与答案相关的讨论。要注意,最重要的事情是保证自己的答案能够满足问题目标要求。应该领会这些答案的潜在含义,以及不同答案可能带来的结果。

在PL/SQL 语句块中使用COMMIT 、ROLLBACK 和SAVEPOINT

登录STUDENT 模式,准确输入如下文本。(也可以在文本文件中输入PL/SQL 语句块,然后在SQL *Plus 提示符下运行这个脚本。)

 

A)如果尝试执行如下命令,请问会看到什么?为什么?

 

答案:不能看到任何数据,因为ROLLBACK to (SAVEPOINT)B 已经撤销最后一个插入语句(插入学生“Norbu”)

B)尝试执行这个命令。请问会发生什么?为什么?

答案:当执行整个命令时,会得到消息“no rows selected.”

在这个PL/SQL 语句块中有三条学生记录新增语句:第1 条是Tashi,在SAVEPOINT A 处;第2 条是Sonam,在SAVEPOINT B 处;最后1 条是Norbu,在SAVEPOINT C 处。然后,当执行命令ROLLBACK to B 时,Norbu 插入操作会被撤销。

C)现在,执行如下命令:

 
|请问会发生什么?

答案:位于SAVEPOINT B 的插入操作被撤销。会删除所插入的Sonam 记录,这个记录是在SAVEPOINT B 处插入的。

D)如果计划执行如下命令,你期望看到什么结果?

 

答案:只会看到有关Tashi 的数据。E)执行这个命令,并解释输出结果。答案:只会看到一条有关Tashi 的记录,如下所示:

 

Tashi 是唯一成功输入到数据库的学生记录。ROLLBACK to SAVEPOINT A 语句会撤销Norbu 和Sonam 的插入操作。

提示通常在事务的复杂部分之前使用SAVEPOINT 。如果事务的这部分出现错误,则会回滚,允许事务的其他部分继续执行。

 
单个PL/SQL 可以包含多个事务,如本例所示:
 
阅读(1233) | 评论(0) | 转发(0) |
0

上一篇:3.2 使用SAVEPOINT(1)

下一篇:3.3 动手试验

给主人留下些什么吧!~~