[Spring] 스프링 DB 2편 10-1. 스프링 트랜잭션 전파1 - 커밋, 롤백

강우엉·2023년 9월 4일

Spring

목록 보기
342/359

트랜잭션이 둘 이상 있을 때 어떻게 동작하는지 자세히 알아보고, 스프링이 제공하는 트랜잭션 전파 (propagation)라는 개념도 알아보자.

간단한 예제 코드로 스프링 트랜잭션을 실행해보자.

BasicTxTest

package hello.springtx.propagation;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;

import javax.sql.DataSource;

@Slf4j
@SpringBootTest
public class BasicTxTest {

    @Autowired
    PlatformTransactionManager txManager;

    @TestConfiguration
    static class Config {

        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    }

    @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 : 해당 테스트에서 필요한 스프링 설정을 추가로 할 수 있다.
  • DataSourceTransactionManager 를 스프링 빈으로 등록했다. 이후 트랜잭션 매니저인 PlatformTransactionManager 를 주입 받으면 방금 등록한 DataSourceTransactionManager 가 주입된다.

commit()
txManager.getTransaction(new DefaultTransactionAttribute())
트랜잭션 매니저를 통해 트랜잭션을 시작(획득)한다.

txManager.commit(status)
트랜잭션을 커밋한다.

commit() - 실행 로그

ringtx.propagation.BasicTxTest : 트랜잭션 시작
DataSourceTransactionManager : Creating new transaction with name [null]
DataSourceTransactionManager : Acquired Connection [conn0] for JDBC
transaction
DataSourceTransactionManager : Switching JDBC Connection [conn0] to manual
commit
ringtx.propagation.BasicTxTest : 트랜잭션 커밋 시작
DataSourceTransactionManager : Initiating transaction commit
DataSourceTransactionManager : Committing JDBC transaction on Connection
[conn0]
DataSourceTransactionManager : Releasing JDBC Connection [conn0] after
transaction
ringtx.propagation.BasicTxTest : 트랜잭션 커밋 완료

rollback()
txManager.getTransaction(new DefaultTransactionAttribute())
트랜잭션 매니저를 통해 트랜잭션을 시작(획득)한다.

txManager.rollback(status)
트랜잭션을 롤백한다.

rollback() - 실행 로그

ringtx.propagation.BasicTxTest : 트랜잭션 시작
DataSourceTransactionManager : Creating new transaction with name [null]
DataSourceTransactionManager : Acquired Connection [conn0] for JDBC
transaction
DataSourceTransactionManager : Switching JDBC Connection [conn0] to manual
commit
ringtx.propagation.BasicTxTest : 트랜잭션 롤백 시작
DataSourceTransactionManager : Initiating transaction rollback
DataSourceTransactionManager : Rolling back JDBC transaction on Connection
[conn0]
DataSourceTransactionManager : Releasing JDBC Connection [conn0] after
transaction
ringtx.propagation.BasicTxTest : 트랜잭션 롤백 완료
profile
우엉이의 코딩 성장일기💻

0개의 댓글