You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在回滚事务中持久化Progress运行时错误至数据库?

跨平台可靠的Progress错误日志写入方案

直接使用Progress原生的SEPARATE TRANSACTION特性即可解决问题,这是跨平台且健壮的方案,完全不需要依赖OS命令或额外进程。

核心原理

SEPARATE TRANSACTION块内的数据库操作会作为独立事务执行,提交后不受外层事务的UNDO/ROLLBACK影响。你可以在错误捕获的EXCEPTION块中,用独立事务写入错误日志,之后再重抛错误——此时外层事务的UNDO只会回滚业务操作,已经提交的错误日志不会被撤销。

代码示例

DO ON ERROR UNDO, THROW:
    -- 这里是你的业务逻辑代码
    CREATE customer (cust-id = 1, name = "Test"). -- 示例业务操作
EXCEPTION
    WHEN OTHERS THEN
        -- 用独立事务写入错误日志
        SEPARATE TRANSACTION:
            -- 假设你的错误表结构如下(根据实际调整)
            CREATE TABLE error_log (
                error_id      INTEGER GENERATED ALWAYS AS IDENTITY,
                error_datetime DATETIME,
                error_message  LONGCHAR,
                error_stack    LONGCHAR
            ) NO-UNDO.

            CREATE error_log.
            error_log.error_datetime = NOW.
            error_log.error_message = ERROR-MESSAGE.
            error_log.error_stack = ERROR-STACK.
            COMMIT. -- 显式提交独立事务,确保日志持久化
        END.

        -- 重抛错误,触发外层事务的UNDO
        THROW.
END.

方案优势

  • 跨平台兼容:SEPARATE TRANSACTION是Progress ABL的原生特性,Windows、Unix/Linux等所有支持Progress的平台都能正常运行
  • 逻辑集中:错误处理和日志写入都在同一个EXCEPTION块内,无需分散逻辑到其他模块
  • 无需临时存储:不需要用NO-UNDO变量或TEMP-TABLE暂存错误信息,直接写入持久化表
  • 健壮可靠:完全依赖Progress自身的事务机制,避免了OS-COMMAND带来的进程启动失败、权限问题等风险

内容的提问来源于stack exchange,提问作者W0lfw00ds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:37:13