【问题标题】:Should Rollback be issued before raise application error?是否应该在引发应用程序错误之前发出回滚?
【发布时间】:2019-10-24 04:49:40
【问题描述】:

这是我的程序的一部分。过程失败时没有发生回滚。
1. 是否应该在引发应用程序错误之前发出回滚?
2. 在这种情况下,将使用引发应用程序错误进行回溯工作。它在日志表中进行跟踪。但是想知道如果回滚,引发应用程序错误是否会正确发出回溯。

EXCEPTION
 WHEN OTHERS THEN
    /*Log that some other error occured and backtrace*/
    eps_datareduction_run_log ( 5, 'CREDIT', current_timestamp,  'FAILED', 'CREDIT: Error Number:'||sqlcode||'Error Code:'||substr(sqlerrm, 1, 200)||'-backtrace:'||dbms_utility.format_error_backtrace, sysdate, user, null, null );
    lv_err_msg := 'Unexcpected Error '||SUBSTR(sqlerrm,1,255);
    raise_application_error(-20000,lv_err_msg || '- backtrace - ' || dbms_utility.format_error_backtrace);
    ROLLBACK;

【问题讨论】:

  • 将回滚放在EXCEPTION WHEN OTHERS THEN 之后,并在其后执行其他逻辑。
  • 您的脚本在发出raise_application_error 时终止,而ROLLBACK 永远不会执行。
  • 修改eps_datareduction_run_log 可能是个好主意,这样它就可以捕获错误并自己调用堆栈详细信息,并且每次调用都不必构建复杂的连接字符串。

标签: oracle exception plsql


【解决方案1】:

应先发出Rollback,然后在日志表中执行您想要执行的所有逻辑操作,然后再执行RaiseRaise 是程序的结尾部分,从技术上讲,它告诉用户这个特定的错误已经发生并且程序已经结束。

【讨论】:

    【解决方案2】:

    看看eps_datareduction_run_log里面有没有COMMIT?这可能是没有发生回滚的原因。在异常处理程序中的任何其他操作之前回滚并在您的日志记录子例程中使用autonomous_transaction pragma 仍然是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多