如何在回滚事务中持久化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
相关产品推荐
相关产品推荐

