0

私はこれを読みました

そして私の質問は:

ジョブでトランザクションを手動で管理したい場合、どうすればよいですか?

今、私はコードを持っており、上記の投稿で説明したように「@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 プラグイン アプローチを「使用する方が良い」という考えです (JPA プラグインはバックエンド マジックに関与しているため、アクションでそれに近い方がよい)。

于 2013-01-17T17:41:26.983 に答える