我有一个使用OCI连接到Oracle的小程序。我可以启动全局事务,暂停它们,在不同的进程中恢复相同的事务,再次暂停,在第一个进程中返回 - 一切正常。我希望能够做的是在我的全局事务中调用Java应用服务器,将我的Xid作为参数传递,并让Web调用作为全局事务的一部分进行一些工作。
我已经设置了Glassfish 4.1并且我使用eclipselink作为JPA实现,但我不知道如何使用传入的Xid来恢复原始事务。我猜我需要使用应用程序管理的持久性,所以我有一些看起来像的代码:
if (emf == null){
emf=Persistence.createEntityManagerFactory("xaPU");
}
EntityManager em = emf.createEntityManager();
TransactionManager tm = (TransactionManager)ctx.lookup("java:appserver/TransactionManager");
我可以这样做:
tm.begin();
em.joinTransaction();
em.persist(data);
tm.commit();
所有数据都写入数据库,但显然这是在新事务中完成的。如果我得到交易:
Transaction tx = tm.getTransaction();
并在调试器中查看tx它似乎有一个Xid设置,但我不知道如何设置这个Xid,或者将它与我从C程序传入的Xid关联。
我是否在正确的轨道上,或者有更简单的方法吗?