相关疑难解决方法(0)

Oracle是否因错误而回滚事务?

这感觉就像一个愚蠢的问题,但我在Oracle事务管理概念指南中看到以下内容:

当发生以下任何情况时,交易结束:

用户发出不带SAVEPOINT子句的COMMIT或ROLLBACK语句.

用户运行DDL语句,例如CREATE,DROP,RENAME或ALTER.如果当前事务包含任何DML语句,Oracle首先提交事务,然后运行并将DDL语句作为新的单语句事务提交.

用户断开与Oracle的连接.当前事务已提交.

用户进程异常终止.当前事务将回滚.

我是否要解释最后一点意味着如果我发出一个有错误的查询,那么事务将被回滚?

sql oracle plsql transactions oracle10g

8
推荐指数
2
解决办法
2万
查看次数

PL/SQL:关于隐式回滚的Oracle文档中的矛盾

Oracle Database PL/SQL语言参考11g第2版(11.2)文档中,"隐式回滚"部分以此文本开头:

"在运行INSERT,UPDATE,DELETE或MERGE语句之前,数据库标记一个隐式保存点(对您不可用).如果语句失败,数据库将回滚到保存点.通常,只会回滚失败的SQL语句,不是整个交易."

因此,如果我将一个SQL语句运行到PL/SQL程序中,并且句子失败,那么该句子将自动回滚.那没问题.

但同一部分以本文结尾:

"如果退出存储的子程序时出现未处理的异常,PL/SQL不会为OUT参数赋值,也不会进行任何回滚."

它似乎与第一个文本相反:如果我的程序以未捕获的异常结束,则不执行回滚.但是第一篇文章说如果SQL语句失败,则会自动完成回滚.

因此,如果我的存储程序包含一个SQL语句,句子失败,异常没有被捕获,我的程序结束,那么SQL语句应该回滚吗?该文件是否有矛盾?

Stack Overflow中的相关问题:


更新(已解决):感谢DrabJay的示例,现在更清楚了:

  • 一件事是回滚SQL语句.
  • 另一件事是包含SQL语句的程序的回滚.

失败的SQL语句的回滚总是完成(无论是否进入程序).程序的回滚取决于调用者:

  • 如果回滚应用于调用方,则会对程序应用回滚.
  • 如果没有对调用者应用回滚,则不会对程序应用回滚.

如果程序是一个匿名块(无来电显示存在),它相当于从用户的语句被调用,而一个失败的用户语句回自动回滚,所以匿名块被回滚.

我认为该文件应该更清楚,特别是"并且不做任何回滚"这两个词:

"如果退出存储的子程序时出现未处理的异常,PL/SQL不会为OUT参数赋值,也不会进行任何回滚."

oracle plsql exception rollback

2
推荐指数
1
解决办法
758
查看次数

标签 统计

oracle ×2

plsql ×2

exception ×1

oracle10g ×1

rollback ×1

sql ×1

transactions ×1