1

私のアプリケーション内では、いくつかの方法でアノテーションをいくつか持っています。1つのアプリケーションで複数のSpring @ Transactionアノテーションを使用できますか?

彼らはCrud Repositoryを使用して自分のデータベースで削除を実行します。私はで何の段階でこれらの削除が実行されるのだろうと思っていますが、私は@Transactional注釈がすべて必要ですか?

1.方法1:

@Transactional 
public void deleteFromSchemaOne(){ 

} 

1方法2は、後façade methodで呼び出されmethodsを削除例えば

は、ファサードの方法は、その後、runnerで呼び出され2:

2.ファサードの方法でこれらの2つのメソッドの呼び出し:ランナーにファサードメソッドを呼び出す

@Transacational 
public void deleteFromAllSchemas(){ 

deleteFromSchemaOne(); 
deleteFromSchemaTwo(); 

} 

3を

@Transactional 
    public void run(String... args) throws Exception { 

     service.deleteFromAllSchemas(); 


} 

私が知りたいのですがどのようなことです:

私の削除は実際にはのどの段階で実行されますか?メソッドがランナー内で完了したときにはそれがありますか?

EDIT:ループと

ファサード方法:

public void deleteFromAllSchemas() { 

    for(int i = 0; i < list.size(); i++){ 

    deleteFromSchemaOne(); 
    deleteFromSchemaTwo(); 

    } 

}

答えて

3

最も外側のトランザクションが終了するので、run()後。 実際、それは最も外側ではなく、唯一の取引です。内部の@Transactionalsは新しいトランザクションを作成せず、既存のトランザクションに参加するだけです。

外部トランザクションが終了する前に変更がコミットされていることを確認する必要がある場合は、トランザクションの伝播を@Transactional(propagation=Propagation.REQUIRES_NEW)に設定する必要があります。すでに存在するトランザクションが存在する場合でも、これにより新しいトランザクションが作成されます。

サンプルコード(少なくとも現在の内容に基づいています)では、run()メソッドはトランザクションを開始するべきではありません。

私が正しくあなたを理解している場合、あなたは基本的に

public void run() { 
    for(int i = 0;i < list.size(); i++) 
     service.deleteFromAllSchemas(i); 
} 

@Transactional 
public void deleteFromAllSchemas(int i) { 
    deleteFromSchemaOne(i); 
    deleteFromSchemaTwo(i); 
} 
+0

の線に沿って何かをしたいが、私がやりたいdeleteFromAllSchemas()メソッドは、スキーマ1と2にする必要がありtransactional-すなわちすべてがあることを確認することです削除されるか何もない、どうすればいいのですか?ご協力いただきありがとうございます。 – java123999

+1

これはあなたの 'deleteFromAllSchemas()'の '@ Transactional'で達成されました。エラーが発生した場合、 'deleteFromSchemaOne()'と 'deleteFromSchemaTwo()'で行われた変更をロールバックします。あなたは本当にトランザクションについても読むべきです。彼らはあなたが正しかったり、「仕事で学ぶ」ことを望むだけのものではありません。 – Kayaman

+1

これは正しいです。私は一般的に、トランザクションは可能な限り短くするべきだということを付け加えたいと思います。したがって、これらのデータベースの削除が互いに依存しない限り(1つが失敗した場合、トランザクション全体をロールバックしたいとしましょう)、2つの削除メソッドに注釈を付ける必要があります。これにより、各削除は別のトランザクションで実行されます。彼らがお互いに依存している場合。 @transactional(propagation = Propagation.MANDATORY)で削除メソッドに注釈を付けることができます。 –

関連する問題