Spring - TransactionalManager, @Transactional

김도형·2022년 10월 24일
0

TransactionalManager 란?

  • 같은 Tx내에서 같은 Connection을 사용할 수 있게 관리

TransactionalManager 사용하는 이유

  • DAO의 각 메서드는 개별 Connection을 사용하기 때문에 Tx 시 1개의 Connection을 사용하기 위함.
  • TransactionalManager를 사용하지 않는 경우 2개 이상의 DAO 메서드로 Tx 시, 별도의 Connetion으로 작동하여 rollback 되지 않음.

[TransactionalManager 미적용 예시]

public void insertA1WithoutTx() throws Exception {
        a1Dao.insert(1, 100); // 성공
        a1Dao.insert(1, 200); // 실패 
    }
 
1. 각 DAO 메서드 개별 주소를 가짐
conn = com.mysql.cj.jdbc.ConnectionImpl@47e4d9d0 // a1Dao.insert(1, 100);
conn = com.mysql.cj.jdbc.ConnectionImpl@630d1b2f // a1Dao.insert(1, 200);

2. rollback 되지 않고, a1Dao.insert(1, 100); 대상만 데이터 주입 

[TransactionalManager 미적용 그림]
DAO의 각 메서드는 개별 Connection

[TransactionalManager 적용 그림]

TransactionalManager 생성 방법

생성 방법 2가지

  • 직접 생성
  • 빈 등록

직접 생성

// TransactionalManager 객체 생성
PlatformTransactionManager tm = new DataSourceTransactionManager(ds); 
// TransactionalManager 속성 정의 
TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());

빈등록

root-context.xml 에서 transactionManager 빈 등록

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
</bean>

@Transactional 등록 방법

root-context.xml 에서 등록

<tx:annotation-driven/>
  • @Transactional 은 클래스나 인터페이스에 붙일 수 있음.
    • 그래서 클래스 내의 모든 메서드에 적용 가능

이미지 출처 : 남궁성 저자의 스프링의 정석

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글