我正在尝试应用更改并在子事务中释放更改的表,但尚未在主事务中释放。
像这样:
MAIN_TRANSACT:
DO TRANSACTION:
// do stuff
SUB_TRANSACT:
DO TRANSACTION:
// change stuff
FIND testTable WHERE ... SHARE-LOCK.
IF AVAILABLE testTable THEN DO:
testTable.value = "new value".
RELEASE testTable.
END.
END. // apply
// do stuff
END.
但是进度所做的一切,并不是在子事务结束后应用数据。
我尝试像汤姆所说的那样这里并在不同的会话中使用不同的文件。
// main.p
DEFINE VARIABLE hSubFile AS HANDLE NO-UNDO.
IF NOT VALID-HANDLE(hSubFile) THEN DO:
RUN sub.p PERSISTENT SET hSubFile.
END.
MAIN_TRANSACT:
DO TRANSACTION:
// do stuff
RUN subTransaction IN hSubFile.
// do stuff
END.
DELETE OBJECT hSubFile NO-ERROR.
// sub.p
PROCEDURE subTransaction:
SUB_TRANSACT:
DO TRANSACTION:
// change stuff
FIND testTable WHERE ... SHARE-LOCK.
IF AVAILABLE testTable THEN DO:
testTable.value = "new value".
RELEASE testTable.
END.
END. // apply
END PROCEDURE.
但这并没有成功,但我也认为我做错了。因为这并没有真正产生一个新的“_progress.exe”进程。
我希望有人能帮助我。
OpenEdge DB 不支持提交子事务,因此它可以在实际事务回滚后继续存在。
AppServer 请求可以是一个解决方案,因为 AppServer 将执行单独的事务。但是
a) 您可能首先必须将 AppServer 添加到您的架构中,并且 b) 如果您想撤消 AppServer 完成的工作,则无法通过调用过程进行控制。
您可以通过操作系统命令另一个 _progres 会话,而不是使用 AppServer。这可能会简化问题 a) - 但对 b) 也无济于事。