728x90
반응형
📌트랜잭션(Transaction)
트랜잭션(Transaction)이란 하나의 작업을 수행하기 위해 데이터베이스에서 논리적인 작업의 단위 또는 한번에 모두 수행되어야 하는 일련의 연산을 말한다.
1. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변화 과정의 작업 단위이다.
2. 하나의 트랜잭션은 commit 과 rollback 명령어를 사용한다.
- 커밋(commit) : 변경 사항을 DB에 정상적으로 반영한다, 반영 완료
- 롤백(rollback) : 작업 실패 시 트랜잭션 실행 전 상태로 되돌린다, 작업 취소
📌 트랜잭션의 특징 (ACID)
1. Atomicity(원자성) : 트랜잭션 구성하는 연산들은 모두 정상 실행되거나 모두 실행되지 않아야 함
2. Consistency(일관성) : 트랜잭션 수행 전 일관된 데이터베이스와 트랜잭션 수행 후 결과도 일관성 있는 상태를 유지해야 함
3. Isolation(격리성) : 수행 중인 트랜잭션이 완료될 때 까지 다른 트랜잭션이 접근 할 수 없음
4. Durability(지속성) : 시스템 장애 발생 하더라도 데이터베이스에 그대로 남아있어야 함
📌 트랜잭션 관리자(Transaction Manager)
TM은 트랜잭션이 완료 될 때까지 트랜잭션 상태를 유지하는 역할을 한다.
여러 작업이 동시에 실행되고 있을때, 만약 2개의 작업 중 1개의 작업이 에러 발생시 이 트랜잭션은 중지가 되고 트랜잭션들이 충돌없이 잘 이루어지도록 관리해준다. 이러한 트랜잭션 관리자를 Spring framework에서도 구현할 수 있다.
DataSourceTransactionManager
스프링에서 JDBC 및 mybatis 등의 JDBC 기반 라이브러리로 데이터베이스로 접근하는 경우 사용하는 인터페이스이다.
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="*" timeout="60" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* com.springproject.webadmin..impl.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
- DataSourceTransactionManager를 사용하기 위해 bean 객체로 설정한다.
- 트랜잭션 제한시간 timeout=60초 발생시 rollback으로 예외 처리한다.
- aop Aspect 앨리먼트로 등록하여 txAdvice로 등록한 어드바이스가 동작하여 트랜잭션을 관리하도록 설정한다.
- 포인트 컷에 Advice를 적용할 메소드들을 execution 명시자에 등록한다.
- 여러개의 db를 사용하는 경우 서로 다른 id의 bean을 여러 개 등록하면 된다.
클래스(class)와 메소드(method) 추가
@Resource(name = "txManager")
private DataSourceTransactionManager transactionManager;
- bean 설정한 트랜잭션 id로 DataSourceTransactionManager 클래스를 어노테이션한다.
DefaultTransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
td.setTimeout(60);
TransactionStatus status = transactionManager.getTransaction(td);
- DefaultTransactionDefinition 객체를 통해 트랜잭션에 관한 속성을 전달한다.
PROPAGATION_REQUIRED : 진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 참여함
PROPAGATION_REQUIRES_NEW : 항상 새로운 트랜잭션을 시작하며 독립된 트랜잭션을 실행함
PROPAGATION_NOT_SUPPORTED : 트랜잭션 없이 동작하도록 , 진행중인 트랜잭션 무시함
- ISOLATION_READ_COMMITTED (default)로 트랜잭션 격리 레벨을 설정하여 다른 트랜잭션에 의해 commit되지 않은 데이터는 다른 트랜잭션에서 볼수 없도록 한다
- TransactionStatus는 트랜잭션 실행을 제어하고 상태를 조회하는 방법을 제공한다.
transactionManager.commit(status);
transactionManager.rollback(status);
- transactionManager.commit(status) : 성공적이면 트랜잭션에서 commit 한다
- transactionManager.rollback(status) : 실패하면 트랜잭션에서 rollback 한다.
반응형