bong-u/til

Spring 개념 - Transaction (트랜잭션)

수정일 : 2024-11-15

상황

  • 소비자가 판매자의 물건을 구매하는 함수를 구현 중이라고 하자
  • 물건을 샀을때, 물건의 가격만큼 판매자의 돈은 증가시키고, 소비자의 돈은 감소시켜야한다
  • 판매자의 돈은 증가시켰는데, 소비자의 돈을 감소시키는 중 오류가 났다
  • 오류가 난 경우, 판매자의 돈을 증가시키기 이전으로 Rollback 해야 한다
  • 위의 두가지 연산은 하나의 Transaction으로 묶여서 한번에 처리되어야 한다

Transaction 관리의 종류

  1. Programmatic transaction management (프로그래밍적 트랜잭션 관리)

    • Transaction 관련 코드를 직접 작성
    • 예제 - TransactionManager 사용
       1// Bean 등록
       2@Bean
       3public PlatformTransactionManager platformTransactionManager(DataSource dataSource) {
       4    return new DataSourceTransactionManager(dataSource);
       5}
       6// 사용할 때
       7// 새로운 트랜잭션을 시작한다
       8var transaction = transactionManager.getTransaction(new DefaultTransactionDefinition());
       9try {
      10    /* Business Logic */
      11
      12    // Commit하여 db에 반영한다
      13    transactionManager.commit(transaction);
      14} catch (DataAccessException e) {
      15    logger.error("Got error", e);
      16    // 예외 발생시 이전 상태로 Rollback 한다
      17    transactionManager.rollback(transaction);
      18}
      
  2. Declarative transaction management (선언적 트랜잭션 관리)

    • Transactino 관련 로직을 Business logic과 완전히 분리
    • 예제 - @Transactional 사용
    1// configuration 클래스에 붙여준다
    2@EnableTransactionManagement
    3
    4// 트랜잭션을 적용하고 싶은 메소드에 붙여준다
    5@Transactional
    6public void createCustomers(List<Customer> customers) {
    7    customers.forEach(customerRepository::insert);
    8}
    

Transaction Propagation (트랜잭션 전파)

  • 추후 기술

Transaction Isolation Level (트랜잭션 격리 수준)

  • 추후 기술