【问题标题】:How to get Oracle db transaction id (replace Postgres txid_current())如何获取 Oracle db 事务 id(替换 Postgres txid_current())
【发布时间】:2018-08-17 13:48:29
【问题描述】:

我必须进行更改才能使用 Oracle Database 11g Express 而不是 PostgreSQL 9.5.4。我们使用 JPA、Hibernate 3.5.0-Final、Java 8、JBoss、 所以我们有:

entityMgr.open();
entityMgr.begin();
entityMgr.merge(action);
//entityMgr.flush();    // I have tried with and without - same result
//entityMgr.getTransaction().isActive();    // returns true
Object transactionId = entityMgr.createNativeQuery("SELECT DBMS_TRANSACTION.LOCAL_TRANSACTION_ID FROM dual").getSingleResult();
...

由于某种原因,transactionId 始终为空。从我读到的transactionId如果没有事务,则为null,但是据我了解,事务正在运行(如果未注释的transaction.isActive()返回true)。在此操作正常之前,我们已连接到 Oracle db 作为其他操作。当我们使用 Postgress 之前它正常工作时,最后一行被以下替换:

Object transactionId = entityMgr.createNativeQuery("SELECT txid_current()").getSingleResult();

我的代码有什么问题,请问如何在 Oracle 中获取实际的 transactionId?

【问题讨论】:

    标签: java sql oracle transactions


    【解决方案1】:

    如果您还没有开始交易,DBMS_TRANSACTION.LOCAL_TRANSACTION_ID 将返回 NULL。

    如果还没有新事务,您可以使用DBMS_TRANSACTION.LOCAL_TRANSACTION_ID(create_transaction => TRUE) 告诉它开始一个新事务。这样一来,它就永远不会返回NULL。

    不幸的是,BOOLEAN 的参数在您的 SELECT..FROM DUAL 方法中无法正常工作。您需要创建一个包装函数或其他东西 - 或使用内联 PL/SQL 函数,如下所示:

    WITH FUNCTION trx_id RETURN VARCHAR2 AS 
    BEGIN
      RETURN DBMS_TRANSACTION.LOCAL_TRANSACTION_ID(true);
    END;
    SELECT trx_id FROM DUAL;
    

    【讨论】:

      猜你喜欢
      • 2013-07-01
      • 1970-01-01
      • 2013-01-29
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多