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

时间:2012-06-30 08:09:55

标签: oracle transactions

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

这些程序都没有交易。

有时我必须在事务中组合多个操作。例如,在一个表中插入并在另一个表中更新,所有这些都在一个事务中。为此,我做了一个单独的程序,它有交易。然后,此过程调用两个过程。

要启用上述单个事务的程序组合调用,我不会在过程中放置​​任何事务行为,如上所述。

大多数时候我只需要执行一个操作,例如在一个表中插入。由于插入过程没有事务行为,因此我必须创建一个具有事务行为的单独过程,并且该过程调用插入过程。

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

我的问题是,是否有某种方法可以在基本过程中使用条件事务行为。通过这个我的意思是一些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语句中放置异常块?如果我在程序中捕获异常,当异常到来时会自动回滚吗?

1 个答案:

答案 0 :(得分:6)

您所编写的内容称为Table API。有些人发誓,有些人则诅咒他们。 Table API的情况基本上是:模块化和代码重用。反对的主要是性能:当一个定制的SQL连接更有效时,它们会逐行或按表处理表格。

我个人站在篱笆的两边。目前,我赞成量身定制的代码:它使交易更容易使用。

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

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


  

&#34;如果您提倡制定业务逻辑,我不清楚   交易存储过程。&#34;

这是一个很大的领域,设计PL / SQL应用程序比业务逻辑还要多。 (如果您可以访问时间机器,那么您应该返回Open World 2009以获取我的演示文稿&#34;使用Intent&#34设计PL / SQL;)

但从广义上讲,是的,PL / SQL层的外向性应该包含业务逻辑API,这些API围绕工作单元组织,即业务事务。

  

&#34;此类程序是自主交易? &#34;

绝对不是。自治事务仅适用于一个目的:记录和审计活动,我们需要永久记录发生的事情而不影响更广泛的事务。该pragma的任何其他用途都是等待发生的kludge或数据损坏错误。

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