2017-04-07 10 views
1

だが、私は例外を持っている第5回更新した後、私は最初の4つの操作がとにかくコミットされることを希望することを仮定しましょう、私は私のサービスで2つの方法@Transactional multiple update;すべての単一のクエリ

public void updateAll() { 
    long[] ids = new long[] {1,2,3,4,5,6,7,8,9,10}; 
    for (long id : ids) { 
     updateId(id); 
    } 
} 

public updateId(long id) { 
    repository.update(id); 
} 

を持ってコミットします。

私は@ Transactionalアノテーションを使用していますが、両方のメソッドに注釈を入れても機能しません。

他のパラメータは必要ですか?それは伝播かもしれない??

この方法の設定方法を教えてください。

ありがとうございました!

答えて

1

だけ持っている:

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public updateId(long id) { 
} 

しかし、重要なビットを、別のクラスからそのメソッドを呼び出します。 つまり、ループをこのクラスから移動します。

トランザクションアノテーションは、パブリックメソッドが外部から呼び出されたときにのみ開始されます。同じクラス内で、別のトランザクションメソッドを呼び出すと、最初のメソッドのトランザクションだけが使用されます。

1

と別の@Transactionalが必要です。REQUIRES_NEWです。

+0

それがあるべき: 「@Transactional(伝播= Propagation.REQUIRES_NEW) 公共ボイドすべて更新(){...}} @Transactional(伝播= Propagation.REQUIRES_NEW) パブリック更新ID(長いID){ ..} ' – pacio14

+1

@ pacio14はい、そうです。別のbeanから2番目のメソッドを呼び出していることを確認してください* – Eugene

関連する問題