2016년 7월 18일 월요일

@Transactional 어노테이션 메소드내부에서 다른 메소드 호출의 경우 트랜잭션 적용범위(스프링 트랜잭션) - 스프링실무교육학원

@Transactional 어노테이션 메소드내부에서 다른 메소드 호출의 경우 트랜잭션 적용범위(스프링 트랜잭션) - 스프링실무교육학원

@Transactional 어노테이션은 Proxy기반이므로 내부 메소드 호출인 경우 트랜잭션이 적용되지 않습니다. 즉 현재 클래스의 메소드가 아닌 다른 클래스의 메소드에 트랜잭션을 걸어야 합니다.

@Service
class MyService {
   @Autowired
   A a;

   @Transactional
   public void myService() {
        a.trTest();
   }
}

@Service
class A {
   @Transactional
   trTest() {
tr1();
tr2();
   }

   @Transactional
   void tr1() { ... }

   @Transactional
   void tr2() { ... }
}

이러한 경우 MyService 직접 tr1(), tr2()를 호출하던지
아니면 별도의 클래스를 만들어서 tr1(), tr2()를 구현하시면 됩니다.

- 서비스에서 tr1(), tr2() 각각 호출하는 경우
@Service
class MyService {
   @Autowired
   A a;

   @Transactional
   public void myService() {
        a.tr1();
        a.tr2();
   }
}

@Service
class A {
   @Transactional
   void tr1() { ... }

   @Transactional
   void tr2() { ... }
}


또는

- 별도의 클래스 만든 후 해당 클래스의 tr1(), tr2() 호출하는 경우
@Service
class MyService {
   @Autowired
   A a;

   @Transactional
   public void myService() {
        a.trTest();
   }
}

@Service
class B {
   @transactional
   void tr1() { ... }
 
   @transactional
   void tr2() { ... }
}

@Service
class A {
   @Autowired
   B b;

   @Transactional
   trTest() {
b.tr1();
b.tr2();
   }
}
[출처] 오라클자바커뮤니티 - http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=500

댓글 없음:

댓글 쓰기