스프링/6. 스프링 DB-2

48. 스프링 트랜잭션 전파

sdafdq 2023. 10. 16. 04:00

트랜잭션이 둘 이상 있을 때 라던지,

아니면 

저번에 트랜잭션 프록시에서 트랜잭션 아닌 거에서 트랜잭션을 호출했을 때

 

어떻게 동작하는 지 알아 봄.

 

@Slf4j
@SpringBootTest
public class BasicTxTest {
    @Autowired
    PlatformTransactionManager txManager;

    @Test
    void commit(){
        log.info("트랜잭션 시작");
        TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute());

        log.info("트랜잭션 커밋 시작");
        txManager.commit(status);
        log.info("트랜잭션 커밋 완료");
    }

    @Test
    void rollback(){
        log.info("트랜잭션 시작");
        TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute());

        log.info("트랜잭션 롤백 시작");
        txManager.rollback(status);
        log.info("트랜잭션 롤백 완료");
    }


    @TestConfiguration
    static class Config{
        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource){
            return new DataSourceTransactionManager(dataSource);
        }
    }
}

일단 그냥 트랜잭션 했을 때

우리가 과거 JDBC 트랜잭션 했을 때 그거임. getTransaction() 하면 트랜잭션 시작. Default 트랜잭션 설정.

이번엔 그냥 트랜잭션 상황을 로그로만 볼려고.

 

2023-10-16T03:41:39.063+09:00  INFO 26792 --- [           main] hello.springtx.propagation.BasicTxTest   : 트랜잭션 시작
2023-10-16T03:41:39.065+09:00 DEBUG 26792 --- [           main] o.s.j.d.DataSourceTransactionManager     : Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2023-10-16T03:41:39.067+09:00 DEBUG 26792 --- [           main] o.s.j.d.DataSourceTransactionManager     : Acquired Connection [HikariProxyConnection@741268455 wrapping conn0: url=jdbc:h2:mem:8717cf07-b6f4-45a4-a715-2e273237e0b6 user=SA] for JDBC transaction
2023-10-16T03:41:39.070+09:00 DEBUG 26792 --- [           main] o.s.j.d.DataSourceTransactionManager     : Switching JDBC Connection [HikariProxyConnection@741268455 wrapping conn0: url=jdbc:h2:mem:8717cf07-b6f4-45a4-a715-2e273237e0b6 user=SA] to manual commit
2023-10-16T03:41:39.070+09:00  INFO 26792 --- [           main] hello.springtx.propagation.BasicTxTest   : 트랜잭션 롤백 시작
2023-10-16T03:41:39.070+09:00 DEBUG 26792 --- [           main] o.s.j.d.DataSourceTransactionManager     : Initiating transaction rollback
2023-10-16T03:41:39.070+09:00 DEBUG 26792 --- [           main] o.s.j.d.DataSourceTransactionManager     : Rolling back JDBC transaction on Connection [HikariProxyConnection@741268455 wrapping conn0: url=jdbc:h2:mem:8717cf07-b6f4-45a4-a715-2e273237e0b6 user=SA]
2023-10-16T03:41:39.071+09:00 DEBUG 26792 --- [           main] o.s.j.d.DataSourceTransactionManager     : Releasing JDBC Connection [HikariProxyConnection@741268455 wrapping conn0: url=jdbc:h2:mem:8717cf07-b6f4-45a4-a715-2e273237e0b6 user=SA] after transaction
2023-10-16T03:41:39.071+09:00  INFO 26792 --- [           main] hello.springtx.propagation.BasicTxTest   : 트랜잭션 롤백 완료

시작하고

Acquired 커넥션 풀에서 커넥션 얻어오고,

뭔가 공통적 처리를 위해 JDBC 커넥션으로 바꾼 듯?

그 다음 롤백이나 커밋이나 비슷한데,

commit이나 rollback 준비작업, initiating 해 주고,

커넥션에 롤백 한다고 하면 커넥션이 DB로 롤백한다고 전해주고,

그 다음 Releasing, 커넥션 풀에다 다시 반환해주고.

 

저기서 그냥 Roll back 부분들을 Commit으로 바꿔주면 똑같음.