在正在进行的子事务中应用更改

问题描述 投票:0回答:1

我正在尝试应用更改并在子事务中释放更改的表,但尚未在主事务中释放。

像这样:

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”进程。

我希望有人能帮助我。

transactions progress openedge progress-4gl
1个回答
0
投票

OpenEdge DB 不支持提交子事务,因此它可以在实际事务回滚后继续存在。

AppServer 请求可以是一个解决方案,因为 AppServer 将执行单独的事务。但是

a) 您可能首先必须将 AppServer 添加到您的架构中,并且 b) 如果您想撤消 AppServer 完成的工作,则无法通过调用过程进行控制。

您可以通过操作系统命令另一个 _progres 会话,而不是使用 AppServer。这可能会简化问题 a) - 但对 b) 也无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.