XA DS와 Global Tx Manager(Atomikos등)을 사용하지 않으실 거라면
DS마나 하나의 TX Manager를 생성해서 연결 시켜주셔야 하며
@Transactional 에 txManager를 지정하여 이 트랜잭션을 관여할 txManager를 지정해주셔야 하는데
이 이야기는 실질적으로 두 DS로 전달되는 SQL실행이 하나의 트랜잭션으로 묶이지 않는다는 이야기 입니다.
두개의 DS로 가는 SQL를 하나의 트랜잭션으로 묶는다면 그게 바로 Global TX의 정의죠.. 그러니 관련 설정을 하셔야 하죠...
관련 설정 없이는
star TX1
- insert DS1
- start TX2
- insert DS2
- commit TX2
commit TX1
여기에서 startTX2부분을 별도의 메소드로 분리해서 별도의 @Transaction을 붙여서 흉내는 낼수 있지만, commit TX1 에서 오류가 발생했을때 tx2가 롤백 되지는 않을겁니다.
정말로 글로벌 TX가 필요한 것인지 잘 판단하시고 설정하세요.
그냥 임시 테이블에 저장해두고, 별도의 배치로 DS2로 전달하면 끝인 업무일수도 있습니다.
참고: Bean이 자기 자신의 메소드를 호출하면 AOP가 적용되지 않기 때문에 TX2가 실행되지 않을수 있습니다.