我必须进行更改以使用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始终为null。根据我的理解,如果没有事务,则transactionId为null,但是据我了解,有事务正在运行(如果未注释的transaction.isActive()返回true)。在此操作正常之前,我们已连接到Oracle db,就像其他操作一样。当我们使用Postgress在最后一行替换为以下内容之前正常工作之前:
Object transactionId = entityMgr.createNativeQuery("SELECT txid_current()").getSingleResult();
我的代码有什么问题,请问如何在Oracle中获取实际的transactionId?
答案 0 :(得分:0)
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;