트랜잭션 작업을 수행할 때 또 다른 트랜잭션 작업이 필요한 메서드를 호출했을 때, 기존 트랜잭션 작업에 포함시켜 하나의 트랜잭션으로 작업하는 것을 트랜잭션 동기화라고 한다.
트랜잭션을 동기화는 하나의 커낵션으로 작업을 해야하니 ThreadLocal에 트랜잭션 정보를 저장하여 사용한다.
트랜잭션 정보를 저장하는 과정은 다음과 같다.
DataSourceTransactionManager
의 doBegin() 메소드에서 트랜잭션을 시작TransactionSynchronizationManager
의 bindResource()메서드에서 ThreadLocal에 트랜잭션 정보를 저장.AbstractPlatformTransactionManager
의 getTransaction()을 통해 트랜잭션 정보를 가져와서 작업.DataSourceTransactionManager
의 doGetTransaction()TransactionSynchronizationManager
의 getResource()트랜잭션 전파 옵션을 통해 트랜잭션 동기화 여부를 결정하는 곳은 AbstractPlatformTransactionManager
의 getTransaction()의 메소드를 보면 트랜잭션 전파 옵션을 분기하는 코드가 있다.
한 줄평 : 처음 트랜잭션을 시작 할 때 getTrnasaction()에서 정보가 없으면 doBegin()을 실행하여 트랜잭션을 새로 만든다.