2016-11-09 11 views
0

は、私は上記のシナリオでは、メソッド呼び出し階層なぜSpringがトランザクションをコミットしているのですか?

public class UpdateProcess { 

     public void startingMethod(List<Object> objects){ 
      for (Object obj : objects) { 
       method1(obj); 
      } 
     } 

     @Transactional 
     public void method1(Object obj) { 
      method2(obj); 
     } 


     public void method2(Object obj) { 
      EmployeeService.updateObject(obj) 
     } 
    } 

public class EmployeeService 

    @Transactional 
    public void updateObject(Object obj) { 

     return customerDao.update(obj); 
    } 


    } 

の下に持って、私の期待は、例外が階層内のどこにでも発生した場合、スレッドは、方法1またはロールバックから出てくるように、バネは、トランザクションをコミットする必要があります。

しかし、方法2で更新が実行されるとすぐに春がトランザクションをコミットしています。どうして?

更新:@Transactionalから@Transactional(propagation=Propagation.REQUIRES_NEW)に変更しても、まだトランザクションをコミットしています。したがって、影響はありません

+1

回答を得たい場合は、適切なコードを記入してください。 – Kayaman

+0

@Kayaman関連コードを掲載しました。あなたが探している特定のものはありますか? – emilly

+0

そのコードはコンパイルされないので、明らかに実際のコードではなく、コメントすることは無意味です。 – Kayaman

答えて

0

プロキシベースのSpring AOPを使用している場合、同じオブジェクトに対して別のメソッドを呼び出しても、アスペクトが適用されることはありません。 UpdateProcess用の@Transactionalの実装は、UpdateProcessと他のBeanの間にあるプロキシで作成されます。したがって、そのメソッドを "外側"ではなく "内側"から呼び出すと、呼び出しはプロキシを通過せず、アスペクトは適用されません。

関連する問題