如何获取Oracle数据库事务ID(替换Postgres txid_current())

时间:2018-08-17 13:48:29

标签: java sql oracle transactions

我必须进行更改以使用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?

1 个答案:

答案 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;