39

特定の理由により、Spring PlatformTransactionManager を使用してトランザクションのコミットとロールバックを手動で実行しました。トランザクションがコミットされた後にコミット後のアクションが実行されるようにフックを設定する必要があります。

見ることによって:

 void commit(TransactionStatus status) throws TransactionException;

例外がスローされない場合、トランザクションが成功したと仮定する以外に、トランザクションが成功したと判断する方法がわかりません。

そして、私はAOPを1つのオプションとして使用できますが、コールバックメソッドを使用して、プログラム的にそれを行うのはどうですか?

4

4 に答える 4

74

TransactionSynchronizationManagerとを使用して、より簡単な方法で必要なものを正確に取得できますTransactionSynchronization

ではTransactionSynchronizationManager、現在のトランザクションに関する情報を取得するための静的メソッドがあり、それTransactionSynchronizationを呼び出したときにポストコミットを自動的に実行できるように登録できます。

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
           void afterCommit(){
                //do what you want to do after commit
           }
})

TransactionSynchronization はスレッドごとに行われることに注意してください (基本的な Web 要求では問題にならないことがよくあります)。

于 2013-02-22T14:49:40.347 に答える
1

私のプロジェクトの 1 つで、特定の理由からPlatformTransactionManager. だから私は使用することを余儀なくされましたorg.springframework.transaction.support.TransactionTemplate

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/support/TransactionTemplate.html

主な利点は、PlatformTransactionManager を正しく実装していれば、手動でコミット/ロールバックする必要がないことです。より具体的なことが必要な場合は、少なくとも TransactionTemplate のソースコードが役立つ場合があります。

使用するのは非常に簡単です:

config.xml

<bean name="transactionTemplate"
            class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="platformTransactionManager"/>
</bean>

MyServiceImpl.java

@サービス
public class MyServiceImpl は MyService を実装します {

    @Autowired
    プライベート TransactionTemplate transactionTemplate;

    public Entity getSomethingWithTx(最終的な長い ID) {

        return transactionTemplate.execute(new TransactionCallback<Entity>() {
            @オーバーライド
            public Entity doInTransaction(TransactionStatus ステータス) {
                //TODO実装
            }
        });
    }

于 2013-02-22T14:27:40.560 に答える