아무거나

[spring] 트랜잭션(Transaction) - 2 본문

Java & Kotlin/Spring

[spring] 트랜잭션(Transaction) - 2

전봉근 2019. 12. 26. 01:02
반응형

[spring] 트랜잭션(Transaction) - 2

 

PlatformTransactionManager 인터페이스 보다 더욱 많이 사용되는 TransactionTemplate에 대해 알아보자.

TransactionTemplate은 PlatformTransactionManager보다 더 간편하게 사용할 수 있다.

 

1. dao에 트랜잭션 관련 내용 추가

   [testDao.java]

....

//PlatformTransactionManager transactionManager;
TransactionTemplate transactionTemplate;

// 트랜잭션 매니저 setter 추가
// public void setTransactionManager( PlatformTransactionManager transactionManager) {
// this.transactionManager = transactionManager;
//}

public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
	this.transactionTemplate = transactionTemplate;
}

....

public void buyTest(final TestDto dto) {
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus arg0) {
            template.update(new PreparedStatementCreator() {
            .... (저장로직)
        }

....

 

2. 스프링 설정파일에 설정(src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml)

   [servlet-context.xml]

<beans:bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
	<beans:property name="transactionManager" ref="transactionManager"></beans:property>
</beans:bean>

<beans:bean name="dao" class="com.javalec.spring_pjt_ex.dao.TicketDao" >
    <beans:property name="template" ref="template" />
    <beans:property name="transactionTemplate" ref="transactionTemplate" />
</beans:bean>

 

3. 트랜잭션 전파 속성 (다시 정리 필요 -> 트랜잭션 속성에 대해 알아보자)

   * 2개 이상의 트랜잭션이 작동할 때, 기존의 트랜잭션에 참여하는 방법을 결정하는 속성

     즉, 트랜잭션 안에서 트랜잭션을 실행하는 경우 등 해당.

- PROPAGATION_REQUIRED(0) : 전체를 롤백(DEFAULT) -> 예를 들어 커다란 쓰레드 안에 작은 쓰레드가 있는데 만약 작은 쓰레드에 문제가 생기면 커다란 쓰레드까지 전부 롤백시킨다.

- PROPAGATION_SUPPORTS(1) : 기존 트랜잭션에 의존 -> 안쪽에 있는 트랜잭션이 바깥쪽의 트랜잭션에 의존한다. 즉, 바깥쪽의 트랜잭션 상태를 따른다.

- PROPAGATION_MANDATORY(2) : 트랜잭션에 꼭 포함 되어야 함(트랜잭션이 있는 곳에서 호출해야 됨) -> 안쪽 트랜잭션을 기준으로해서 바깥쪽에서 트랜잭션이 없고 안쪽은 있는 상황에서 안쪽을 호출하면 에러가 발생

- PROPAGATION_REQUIRES_NEW(3) : 각각 트랜잭션 처리 -> 바깥쪽 안쪽 모두 트랜잭션이 있지만 한쪽에서 에러가 난다고 전부 취소하지 않는다.

- PROPAGATION_NOT_SUPPORTED(4) : 트랜잭션에 포함 하지 않음(트랜잭션이 없는 것과 동일) -> 트랜잭션이 있긴있지만 해당 옵션을 주면 트랜잭션에 전혀 포함시키지 않음.

- PROPAGATION_NEVER(5) : 트랜잭션에 절대 포함 하지 않음.(트랜잭션이 있는 곳에서 호출하면 에러 발생) -> 안쪽에 나를 쓸때 바깥쪽에 트랜잭션이 걸려있으면 쓰지마라.

 

     ex) [src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml]

....

<beans:bean name="transactionTemplate1" class="org.springframework.transaction.support.TransactionTemplate">
    <beans:property name="transactionManager" ref="transactionManager" />
    <beans:property name="propagationBehavior" value="0"/>
</beans:bean>

....

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/dashboard

반응형
Comments