【发布时间】:2013-09-27 18:20:40
【问题描述】:
我是 Oracle PL/SQL 的新手,我正在尝试从使用 C# 的 SQL Server 调整为使用 PL/SQL 的 Oracle 自定义 Web 应用程序,用于多层应用程序。
我目前在回滚事务时遇到问题。由于我习惯于编写可重用代码,因此我使用这些类中的包和方法编写了我的 PL/SQL 代码。我的更新过程首先完成验证,如果验证成功,则调用一系列的各种包方法来完成保存。不幸的是,当调用 Rollback 函数时,我在更新过程的 EXCEPTION 部分中的回滚不会回滚所有内容。我不知道它为什么这样做。我的基本代码(虽然由于法律问题不准确)如下:
PROCEDURE SaveApplicationData(
variableName IN VARCHAR2 DEFAULT NULL,
--...
seq_id OUT INT )
AS
BEGIN
SET TRANSACTION NAME 'Transaction Name';
--Save initial program record
SaveNewRecord(variableName, seq_id);
IF (seq_id != 0) THEN
--If saved successfully, seq_id represents record ID
package_class.secondarySaveMethod(variableName, seq_id);
second_package_class.anotherSaveMethod(variableName, seq_id);
END IF;
COMMIT;
htp.p('Sequence ID: ' || seq_id);
htp.p('Saved the record"' || programName || '" successfully!');
EXCEPTION
WHEN OTHERS THEN
utilityPackage.rollbacktransaction;
END SaveApplicationData;
utilityPackage.rollbacktransaction 包括一个 ROLLBACK 以及我们组织使用的自定义错误异常处理包。
本质上,它会回滚导致错误的部分,但是一旦它回滚该部分,它就会继续处理剩余的事务(并且不会回滚之前执行的代码块)。
如果这没有意义,请告诉我 - 并提前感谢您的帮助!
【问题讨论】:
-
这听起来比实际需要的要复杂。也许有必要以这种方式做事。无论哪种方式,如果没有看到您的所有代码,我们很难提供任何建议。
-
APC - 在什么方面听起来太复杂了?就代码而言,它与我的代码结构相同……只是变量更少,名称不同。我的主要问题是在包方法中执行回滚时 - 它是否还应该回滚调用包方法的父过程中的代码?
-
回滚会影响整个事务。除非你有保存点
-
好的,这就是我认为它应该做的,但不确定,因为它没有按预期运行。我会检查发布更准确的代码。感谢您的快速回答。
标签: sql oracle plsql transactions rollback