0

私の要件は、5 つのメソッドを使用して 5 つのテーブルにデータを保存することです。これらの 5 つのメソッドは、@Transactional で注釈が付けられた単一の親メソ​​ッドの下にラップされます。

この親メソッドをループで 100 回呼び出しています。

制約は

  1. 1 回の反復で 1 つのメソッドが失敗した場合でも、トランザクションをロールバックする必要があり (つまり、5 つのメソッドを例外なく保存する必要があります)、次の反復でフローを続行する必要があります。

  2. 1 つの反復が失敗しても、他のすべての反復がロールバックされるべきではありません。I.,e 100 回の反復で、5 回目の反復が失敗し、他のすべての反復が成功した場合、99 回の反復のすべての操作がコミットされます。

  3. 1 回の反復で 5 つのメソッドすべてを正常に実行した後、トランザクションがコミットされれば OK です。

問題は

  1. 5 回目の反復が失敗した場合、次の反復で古い値がエンティティに表示されます。それを避けるために、catch ブロックで session.clear() メソッドを使用しました。あれは正しいですか?しかし問題は、
    次の反復で 5 つのメソッドの挿入が成功した後でも、トランザクションがロールバックされることです。また、セッション内の前の 4 つの反復のデータ状態はすべてクリアされています。

Spring 3.2、Hibernate3、HibernateTransactionManager を使用しています

4

3 に答える 3

0

ここで春のトランザクションの伝播レベルを調べて、要件に最も適したものを選択してください。必要なことを実行する例は次のとおりです (同様にマークすることもできmyServiceます@Transactional) が、他のレベルを見たいと思うかもしれません。

public void myService() {
    // call myTaskCaller as many times as you like
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void myTaskCaller() {
    task1();
    task2();
    task3();
    task4();
    task5();
}

private void task1(){}
private void task2(){}
private void task3(){}
private void task4(){}
private void task5(){}
于 2013-09-14T05:12:52.207 に答える