0

我读过这个

我的问题是:

如果我想在 Job 中手动管理我的交易,我应该怎么做?

现在我有一个代码并在那里使用“@NoTransaction”,就像上面的帖子中解释的那样:

@NoTransaction
@Override
public JobResult doJobWithResult() throws Exception {

    ...  

    JobResult result = new JobResult();
     try {

        //MyEntity.em().getTransaction().commit();
        MyEntity.em().getTransaction().begin();
....

但是,但在开始(begin())交易的那一刻,我仍然有一个错误:

java.lang.IllegalStateException:事务已经激活

因此,即使我使用@NoTransaction,作业仍然会启动自己的事务。

我可以这样修复它:

   MyEntity.em().getTransaction().commit(); // commit previous started transaction
   MyEntity.em().getTransaction().begin();

但这似乎不是一个好的解决方案。

你会推荐什么?

4

1 回答 1

2

我发现:如果使用:

  JPAPlugin.startTx(false); // to start transaction
  JPAPlugin.closeTx(false); // to close and commit transaction
  JPAPlugin.closeTx(true); //  to roll-back transaction 

而不是使用所有这些 JPA 东西,然后一切正常。

所以,这对我来说是一个解决方案。但我并没有深入了解那是怎么玩的!认为/识别我是手动使用 jpa 还是通过插件 api 工作 .. 然后决定。如果查看 startTx 方法,它看起来像这样:

  if (autoTxs) {
        manager.getTransaction().begin();
    }
    JPA.createContext(manager, readonly);  

这个想法是,当您想在 Play 中手动管理事务时,“更好地使用”JPA-Plugin-approach(因为 JPA 插件涉及一些后端魔法,所以最好在您的操作中接近它)

于 2013-01-17T17:41:26.983 回答