0

私のSpringアプリケーションでは、サービス層のメソッドが としてマークされて@Transactional(propagation=Propagation.REQUIRED)おり、使用して<tx:annotation-driven />います。通常、メソッドの完了時にトランザクションを自動的にコミットするというデフォルトの動作は魅力的です。しかし、特定のケースでは、メソッドの終了直前にコミットする必要があります。その時点の後に来る部分が例外をスローしたとしても、そうです。

そのようなメソッド内で現在のトランザクションにアクセスする方法はありますか? 私はこれを試しました:

TransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_MANDATORY); // make sure we're talking about the same transaction already provided by the annotation
TransactionStatus status = transactionManager.getTransaction(td);

// perform various JDBC operations

transactionManager.commit(status);
methodThatNeedsToBeCalledAfterCommit();

しかし、ログを見ると、「AbstractPlatformTransactionManager.processCommit(752) | Initiating transaction commit」が 1 回しか発生していないことがわかります。タイムスタンプから、これはメソッドの通常の動作であるafter のように見えます。methodThatNeedsToBeCalledAfterCommit()@Transactional

そのようなメソッド内で実際にコミットを強制する方法はありますか?

4

3 に答える 3

1

私はそうは思わない。さらに、Spring はメソッドの最後で再コミットを試みます。だから2コミット:悪い。

メソッドの構成を再考する必要があります。たぶん、既存のものを 2 つのメソッドに分割します。1 つは @Trnasactional を使用し、もう 1 つは残りの行を使用します。

于 2012-07-27T15:27:40.023 に答える
0

これはおそらく、デフォルトのトランザクションの伝播が PROPAGATION_REQUIRED であり、トランザクション全体が完了したときにのみコミットされるためです。これは外部メソッドです。PROPAGATION_REQUIRES_NEW で試すことができます:

td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

別の代替手段は、TransactionTemplateを使用することです

于 2012-07-27T17:25:59.180 に答える
0

トランザクションを適用するプログラムからこのメソッドを呼び出してみてください。

     DefaultTransactionDefinition transdefinition = new DefaultTransactionDefinition();
         PlatformTransactionManager manager =new  PlatformTransactionManager(); 
         TransactionStatus status=null;




public void beginTransaction()
    {

        transdefinition.setPropagationBehavior(0); 


         status = manager.getTransaction(transdefinition);
    }

public void commitTransaction()
    {
if(status.isCompleted()){
manager.commit(status);
    }
}

 public void rollbackTransaction()
    {
if(!status.isCompleted()){
       manager.rollback(status);  
    }
}
于 2013-04-08T03:55:30.073 に答える