최근에 작업하는 것이 최소 2대의 DB에 JPA를 통해서 INSERT를 해야해서 어렴풋이만 알고 있던 분산 Transaction에 대해서 정리해 보았다.
테스트 케이스
- (1) MySQL DB 1 -> (2) MySQL DB 2 -> (3) MySQL DB 1 -> (4) MySQL DB 2 순서대로 INSERT
정상인 경우
MySQL DB 1
MySQL DB 2
Transaction이 깨지는 경우
테스트 케이스에서 (4) 케이스에서 DB에러가 발생하고 (3) 케이스까지 실행하고 Break를 통해 멈췄다.
2개의 DB 모두가 전체적으로 Transaction이 되어야 하므로 ChainedTransactionManager로 설정하였다.
(분산 Transaction이 되어야 한다는 의미)
Transaction 중간에 Break를 통해서 멈춘 상태에서 MySQL DB 1을 본 결과
Transaction 중간에 Break를 통해서 멈춘 상태에서 MySQL DB 2을 본 결과
MySQL에서는 READ UNCOMMITTED를 변경해 놓고 SELECT를 해야 데이터가 보인다.
-- SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
이 상태에서 멈춰놓았던 브레이크를 풀면 (4)의 경우에서 DB 에러가 나면서 위의 DB에 들어갔던 데이터들은 COMMIT되지 않고 ROLLBACK이 진행된다.