Print
카테고리: [ Java ]
조회수: 6100

1. 개요

트랜잭션은 참 다양한 곳에서 의미를 가지고 있다.

데이터베이스에서는 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻한다.

일반적인 컴퓨터 과학에서는 쪼개질 수 없는 업무처리의 단위를 의미하기도 한다.


2. 트랜잭션의 성질


3. 개발에서의 트랜잭션

DB 접근이 발생하는 여러 단위 작업들을 의미있는 그룹으로 묶어서 일괄 커밋 또는 일괄 롤백하는 매커니즘을 뜻한다.

  1. 프레임워크들에서는 다음과 같은 기법들을 사용하거나 지원한다.
  2. 선언적 트랜잭션 관리 방법 사용
    - 어노테이션 방식으로 @Transactional을 선언하여 사용하는 방법이 일반적이며 이를 선언적 트랜잭션이라고 부른다.
  3. JDBC
    - JDBC, MyBatis 등을 사용할 때는 DataSourceTransactionManager를 관리자로 등록한다.
    - 이 클래스는 dataSource 프로퍼티를 통해 전달받은 Connection으로 커밋, 롤백을 수행하면서 관리한다.
  4. JPA 트랜잭션 방식 지원
    - JPA 트랜잭션은 JpaTransactionManager를 Bean으로 등록하여 사용한다.
    - 이 클래스는 프로퍼티를 통해 전달받은 EntityManagerFactort를 이용해서 트랜잭션
  5. JTA 트랜잭션 방식 지원
    - 다중 자원에 접근 시 JTA(Java Transaction API)를 사용하는데, JTA 트랜잭션은 JtaTransactionManager를 Bean으로 등록하여 사용한다.
    -  Bean으로 등록할 때 transactionmanagerName 프로퍼티를 이용해서 JNDI 이름을 설정한다.
  6. Nested Transation 지원
  7. 복수 DataSource에 대한 트랜잭션 관리 제공
  8. Lazy Connection
    - Lazy Connection이란 쿼리 호출 시점에 해당 데이터소스만 연결하는 것이다.
    - Lazy Connection 적용 시, 여러 Lazy Bean Id를 리스트로 등록하고 미적용 시 일반적인 데이터소스 Bean Id를 리스트로 등록한다.
  9. 타임아웃 속성 지원
    - 지정한 시간 내에 해당 메소드 수행이 완료되지 않는다면 롤백을 수행한다. -1이라면 타임아웃이 없다. 
    - @Transactional(timeout=10)

4. 선언적 트랜잭션

선언적 트랜잭션 방법은 <tx:advice> 태그를 사용하는 방법과 @Transactional 어노테이션을 사용하는 방법이 있다.

4.1. tx 네임스페이스 사용

Bean 설정 파일에서 tx 네임스페이스를 추가하여 트랜잭션 속성을 정의한다.

4.2. 어노테이션 기반 설정

@Transactional 어노테이션은 메소드나 클래스, 인터페이스에 적용되며 속성 설정이 가능하다. (propagation의 디폴트가 REQUIRED)

@Transactional(propagation=Propagation.REQUIRED)
@Transactional
@Override
public void removeBoard(BoardVO vo) throws Exception {
  replyDAO.removeAllRepl(vo.boardNo);
  boardDAO.deleteBoard(vo.boardNo);
}

메소드에 설정된 @Transactional이 가장 우선된다. 따라서 공통설정은 인터페이스나 클래스에 적용하고 특별한 설정은 메소드에 적용하면 된다.


5. Transactional 속성 (Propagation - Nested Transaction)

한 트랜잭션 내부에서 중첩된 트랜잭션 처리가 필요할 때 사용하는 기능이다. Spring은 propagation 속성을 통해 Nested Transaction을 지정한다.

Propagation(전파옵션)에 대해 알아보자.

이러한 옵션을 설정하는 방법은 어노테이션 방식과 xml 방식이 있다.


6. Transactional 속성 (Isolation)

격리 레벨에 대해 알아보자.