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
相关产品推荐
相关产品推荐

