해당 소스는 : https://github.com/syh8088/spring-multi-transaction
블로그 소개 : https://syh8088.github.io/2021/03/14/JAVA/Transaction/Multi-Transaction/
다중 스키마를 이용하고 Mybatis + JPA 기능을 추가 해보았습니다.
결과가 원하는 대로 안나와서 문제가 발생되더군요.
ChainedTransactionManager, JtaTransactionManager 이용하기전에 일반적으로 각각 독립만 TransactionManager로 생성한 것을
Mybatis로 테스트 해보았는데요
즉 LogicService에 @Transactional이 있는 경우(memberTxManager)
그러니깐
=======================================================================================
LogicService (@Transactional (boardTxManager)) -> memberService -> boardServie 를 실행해서
boardServie 에 INSERT 하고 바로 Exception을 발생시켰습니다.
그럼 결과는
Mybatis 버전
==============================================================================================
이렇게 결과가 발생되었습니다.
member에 insert 된것은 commit 되어야 하고
당연 LogicService에 @Transactional (boardTxManager) 설정했으니깐 rollback이 안되고!! commit 됩니다!!
board에 insert 된것은 rollback이 되지 않았습니다.
왜 둘다 commit이 된건가요?
반대로
==============================================================================================
LogicService (@Transactional (memberTxManager)) -> memberService -> boardServie 를 실행해서
boardServie 에 INSERT 하고 바로 Exception을 발생시켰습니다.
Mybatis 버전
==============================================================================================
이렇게 ChainedTransactionManager, JtaTransactionManager 이용하지 않았는데 둘다 rollback 되었습니다....
무엇일까요? 혹시 spring이 업그레이드 되면서 자동으로 ChainedTransactionManager 해주는걸까요?
이유를 잘모르겠습니다...
또 JPA로 이용하면 정상적으로 다음과 같은 결과가 나왔습니다.... 즉
==============================================================================================
LogicService (@Transactional (memberTxManager)) 로 셋팅하면
JPA 버전
LogicService (@Transactional (boardTxManager)) 로 셋팅하면
JPA 버전
==============================================================================================
참고로 해당 DataSource Config는
1. /src/main/java/com/transaction/config/database/MainHikariSchemaDataSourceConfig.java
2. /src/main/java/com/transaction/config/database/SubHikariSchemaDataSourceConfig.java
여기에 있습니다.
마지막으로 긴글 읽어주셔서 정말 감사합니다!
좋은 하루 보내세요!!