하루의 삽질을 거쳐서...
간신히 찾은 나의 방법
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 [아빠개발자의 노트]
'DATABASE(SQL)' 카테고리의 다른 글
MYSQL INSERT UPDATE (ON DUPLICATE KEY) (0) | 2020.08.21 |
---|---|
mysql - 프로시저 (0) | 2020.06.24 |
데이터베이스에서 null 과 빈 문자열(empty string)의 차이점 (0) | 2020.03.23 |
Maria DB (1) | 2020.03.23 |
이력 테이블에서 최종 데이터만 조회하기 (0) | 2020.03.03 |