私の要件は、5 つのメソッドを使用して 5 つのテーブルにデータを保存することです。これらの 5 つのメソッドは、@Transactional で注釈が付けられた単一の親メソッドの下にラップされます。
この親メソッドをループで 100 回呼び出しています。
制約は
1 回の反復で 1 つのメソッドが失敗した場合でも、トランザクションをロールバックする必要があり (つまり、5 つのメソッドを例外なく保存する必要があります)、次の反復でフローを続行する必要があります。
1 つの反復が失敗しても、他のすべての反復がロールバックされるべきではありません。I.,e 100 回の反復で、5 回目の反復が失敗し、他のすべての反復が成功した場合、99 回の反復のすべての操作がコミットされます。
1 回の反復で 5 つのメソッドすべてを正常に実行した後、トランザクションがコミットされれば OK です。
問題は
- 5 回目の反復が失敗した場合、次の反復で古い値がエンティティに表示されます。それを避けるために、catch ブロックで session.clear() メソッドを使用しました。あれは正しいですか?しかし問題は、
次の反復で 5 つのメソッドの挿入が成功した後でも、トランザクションがロールバックされることです。また、セッション内の前の 4 つの反復のデータ状態はすべてクリアされています。
Spring 3.2、Hibernate3、HibernateTransactionManager を使用しています