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

Progress中如何在子事务提交更改而主事务暂不提交?

Progress 4GL 独立子事务提交解决方案

问题根源

  • Progress的嵌套事务并非真正独立:内层DO TRANSACTION仅作为事务分段标记,只有最外层主事务提交时,所有层级的数据更改才会生效,因此第一个方案中子事务结束后无法落地更改。
  • 持久化过程默认共享主会话上下文:RUN sub.p PERSISTENT仅在当前会话创建程序实例,不会启动新的_progress.exe进程,子过程的事务仍受主事务约束。

正确实现:创建独立会话

要实现子事务独立提交、主事务暂不提交,必须创建完全独立的数据库会话,让子事务在独立进程中执行。以下是可行代码示例:

主程序(main.p)

DEFINE VARIABLE hSession AS HANDLE NO-UNDO.
DEFINE VARIABLE hSubProc AS HANDLE NO-UNDO.

// 创建独立数据库会话(启动新_progress.exe进程)
CREATE SESSION hSession.
// 在新会话中启动持久化子程序
RUN sub.p PERSISTENT SET hSubProc ON SESSION hSession.

MAIN_TRANSACT:
DO TRANSACTION:
    // 主事务内操作
    MESSAGE "主事务执行中..." VIEW-AS ALERT-BOX.

    // 调用独立会话中的子事务处理过程
    RUN subTransaction IN hSubProc.

    // 主事务继续执行,此时子事务更改已独立生效
    MESSAGE "主事务未提交,子事务更改已落地" VIEW-AS ALERT-BOX.

    // 根据业务需求选择提交/回滚主事务
    // COMMIT TRANSACTION MAIN_TRANSACT.
    // ROLLBACK TRANSACTION MAIN_TRANSACT.
END.

// 清理资源,避免进程泄漏
DELETE OBJECT hSubProc NO-ERROR.
DELETE OBJECT hSession NO-ERROR.

子程序(sub.p)

PROCEDURE subTransaction:
    SUB_TRANSACT:
    DO TRANSACTION:
        // 子事务内的数据修改逻辑
        FIND testTable WHERE testTable.id = 1 SHARE-LOCK.
        IF AVAILABLE testTable THEN DO:
            testTable.value = "new value".
            RELEASE testTable.
        END.
        // 提交子事务,更改立即写入数据库
        COMMIT TRANSACTION SUB_TRANSACT.
        MESSAGE "子事务已提交,更改生效" VIEW-AS ALERT-BOX.
    END.
END PROCEDURE.

关键说明

  • CREATE SESSION会启动全新的_progress.exe进程,建立独立的数据库连接和事务上下文,子会话的操作完全不受主事务影响。
  • 子会话中的事务提交后,更改直接落地,无需等待主事务完成。
  • 务必清理会话和程序句柄,避免残留进程占用资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:38:19