@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
댓글 없음:
댓글 쓰기