전자정부 프레임워크에 트랜잭션 적용하기

|

하루의 삽질을 거쳐서...

 

간신히 찾은 나의 방법

1. dispatcher-servlet.xml

상단 beans 에 
xmlns:tx="http://www.springframework.org/schema/tx"
추가

하단 xsi:schemaLocation 에
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
추가

<!-- 트랜잭션 처리를 위한 추가 -->
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>

<!-- 트랜잭션 처리를 위한 추가 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>

2. context-transaction.xml

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

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="*" rollback-for="Exception"/>
		</tx:attributes>
	</tx:advice>

	<aop:config proxy-target-class="true">
		<aop:pointcut id="requiredTx" expression="execution(* nepp.att.service.*.*(..))"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
	</aop:config>
    
3. serviceImpl
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})

4. service가 implements 하는  인터페이스 에도
@Transactional 선언해야.

5. 그 외
DB의 오토커밋 설정여부 확인?

-- Maria DB
show variables like 'autocommit%'; // autocommit 설정값 확인

SET AUTOCOMMIT = TRUE;  --> 설정 // autocommit 설정 또는 해제
SET AUTOCOMMIT = FALSE; --> 해제

COMMIT; // 트랜잭션 commit, rollback
ROLLBACK;

위는 선언적 처리방법

 

아래는 명시적 처리방법..

주의할 점은 정상일 경우 커밋을 명시안하면 이도저도 아니게 처리가 안된상태로 남는다는것

@Resource(name = "txManager")
protected DataSourceTransactionManager txManager;

~~~

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus txStatus = txManager.getTransaction(def);

~~~~

try { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ~~~ 각종 INSERT UPDATE 등 DB 문 ~~~
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      txManager.commit(txStatus); //정상일경우 COMMIT;
	  model.put("result", 0);
    } catch (Exception e) {
      e.printStackTrace();
      txManager.rollback(txStatus); //에러날경우 CATCH로 빠져서 ROLLBACK;
      model.put("result", -1);
    }
}

출처: https://dydals5678.tistory.com/121 [아빠개발자의 노트]
And