4

で注釈が付けられた2つのメソッドがあり@Transactionalます。2番目のメソッドは、最初のメソッド内のどこかにネストされて呼び出されます。

ここで、次の動作を実行したいと思います。

  • 2番目のネストされたメソッドが入力されるたびに、新しいネストされたトランザクションが作成される必要があります。そのトランザクションがロールバックのマークを付けられている場合、そのトランザクションのみをロールバックする必要があります。
  • ただし、外部メソッドのトランザクションがロールバックのマークを付けられている場合、内部のネストされたトランザクションはすべて、ロールバックのマークが付けられているかどうかに関係なく、ロールバックする必要があります。

Propagationこのような機能を実現するには、どのように値を設定する必要がありますか?


PS:私はHibernateTransactionManagerを使用しています。

4

3 に答える 3

4

NESTEDを使用する必要があります。この伝播モードは、この動作を実現するためにJDBC SavePointを使用するため、ネストされた動作は、トランザクションがJDBC接続の単なるラッパーである場合にのみ機能することに注意してください。JTAトランザクションでは機能しません。詳細については、Springのドキュメントを参照してください。

于 2012-06-25T17:06:13.960 に答える
1

Javaトランザクションのデフォルトの動作を明確にする必要があります。親がコミットしない限り、ネストされたすべてのトランザクションはコミットされません。ここでそれについて読んでくださいhttp://en.wikibooks.org/wiki/Java_Persistence/Transactions

于 2014-02-14T17:20:22.003 に答える
0

このような機能を別々のスレッドで実装することを提案します。つまり、ネストされたトランザクションで開始するメソッドは、別々のスレッドで開始するだけです。次のような擬似コードのように見える場合があります。

//SomeService 
// Here we start an external transaction
@Transactional
    int processAllInTransaction() {
        List<Integer> jobIds = jobService.getJobs();
        if (!jobIds.isEmpty()) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    jobIds.forEach(jobId ->
                            //Execute eveything in external transaction   
                            threadPool.execute(jobId)
                    );
                }
            }).start();

        } 
        return jobIds.size();
    }

//Method of Executor Service
void execute(final int jobId) {
    tasks.add(taskExecutor.submit(new Runnable() {
        void run() {
            someProcessor.processJob(jobId);
        }
    }));
}

//Method of another Service
@Transactional
public void processJob(int jobId) {
    //this will work in separate thransaction since was executed in another Theread
    someDao.doWorkInExternalTransaction(jobId);
}

本当に外部トランザクションを制御する必要がある場合-新しいThereadの単一の外部トランザクションでネストされたトランザクションの作業を行い、スレッドから返される結果を待ち、必要に応じて例外をスローします

于 2016-11-15T18:23:58.067 に答える