在Oracle过程中添加条件事务行为

在Oracle过程中添加条件事务行为,oracle,transactions,Oracle,Transactions,在oracle 10g中,每个操作(插入、选择、更新、删除)的每个表都有一个存储过程。实际上,每个表每个操作可以有多个过程,例如,在选择的情况下,可以是SelectList、SelectOneRecord、Search(使用动态查询) 这些过程都没有事务 有时我必须在一个事务中组合多个操作。例如,在一个事务中插入一个表并在另一个表中更新。为此,我制定了一个单独的程序,其中包含事务。然后,此过程调用这两个过程 为了在单个事务中启用上述过程调用组合,我不在过程中放置任何事务行为,如上所述 大多数情况

在oracle 10g中,每个操作(插入、选择、更新、删除)的每个表都有一个存储过程。实际上,每个表每个操作可以有多个过程,例如,在选择的情况下,可以是SelectList、SelectOneRecord、Search(使用动态查询)

这些过程都没有事务

有时我必须在一个事务中组合多个操作。例如,在一个事务中插入一个表并在另一个表中更新。为此,我制定了一个单独的程序,其中包含事务。然后,此过程调用这两个过程

为了在单个事务中启用上述过程调用组合,我不在过程中放置任何事务行为,如上所述

大多数情况下,我只能执行一个操作,例如在一个表中插入。由于insert过程没有事务行为,因此我必须创建一个具有事务行为的单独过程,该过程调用insert过程

我最终得到了许多基本过程(一个表,一个操作)和许多事务过程,它们基本上是基本过程的包装

我的问题是,在基本过程中是否有条件事务行为。我的意思是一些if条件,在这里我可以放置事务逻辑,因此事务行为可以基于我传递的某个参数打开或关闭。然后,当我只想做一个操作时,比如在表中插入,我用事务行为调用基本过程;当我想在一个事务中调用两个过程时,比如在一个事务中在一个表中插入,在另一个表中更新,那么我会创建一个单独的事务过程,在没有事务行为的情况下调用这两个基本过程

以下是调用另一个过程并将其包装到事务中的事务过程:

BEGIN
    SAVEPOINT the_start;

    BasicProcedure(<list of parameters>);

    COMMIT;

    EXCEPTION
         WHEN OTHERS THEN

         BEGIN
             ROLLBACK TO the_start;
             RAISE;
         END;
END;
开始
保存_启动点;
基本程序();
犯罪
例外情况
当其他人
开始
回滚到_开始;
提高;
结束;
结束;

我可以很好地将保存点行和提交行放在if语句中,但也可以将异常块放在if语句中。我必须在if语句中放入异常块吗?若我在过程中捕捉到异常,当异常出现时它会自动回滚吗?

您所编写的称为表API。一些人对他们发誓,另一些人诅咒他们。表API的情况基本上是:模块化和代码重用。反对的理由主要是性能:它们鼓励逐行或逐表处理,而定制的SQL联接将更有效

就我个人而言,我已经站在了栅栏的两边。目前我喜欢定制代码:它使事务更容易处理

这让我想到了你的处境。表API应该是通用的,并且在所有情况下都可用。这意味着它们无法控制事务的管理:事务完全属于调用表API方法的程序。这些程序是实现业务逻辑的代码:业务事务由构成工作单元的许多活动组成。所有这些都必须成功才能使事务成功,否则需要回滚业务事务。如果表API命令发出它们自己的提交,则随后的失败将使业务事务处于不一致的状态。适用于此级别以及单个SL级别

这实际上与使用定制SQL编写存储过程没有什么不同


“我不清楚您是否主张制定业务逻辑 事务存储过程。”

这是一个很大的领域,设计PL/SQL应用程序比设计业务逻辑要复杂得多。(如果您可以访问时间机器,您应该返回OpenWorld2009,观看我关于“用心设计PL/SQL”的演示文稿)

但是从广义上讲,是的,PL/SQL层面向外部的方面应该包括业务逻辑API,这些API是围绕工作单元(即业务事务)组织的

“这样的程序是自主交易吗?”

绝对不是。自治事务只适用于一个目的:记录和审计活动,我们需要在不影响更广泛事务的情况下永久记录所发生的事情。任何其他使用该pragma的行为都是一个等待发生的混乱或数据损坏错误


商业交易是纯粹而简单的交易。存储过程应该拥有提交,或者应该将其推迟到调用程序

你说的“定制代码”是什么意思?每个表的表API而不是通用的表API?@APC:回答得很周到,但我不清楚你是否主张将业务逻辑事务存储过程。这样做似乎是个好主意。你同意吗?这样的程序应该是自主交易吗?@APC:非常彻底,在这两点上我都同意。我投你一票。我很想看看你的演讲。至少Oracle不同于postgres,让我们设置存储过程的隔离级别,以便更好地将操作与工作单元的意图相匹配。您为什么不接受APC的答案?如果是,为什么不说出来,并邀请其他答案?