트랜잭션이란?

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

트랜잭션의 특징

트랜잭션의 특징은 크게 4가지로 구분된다.

  • 원자성(Atomicity) : 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다.
  • 일관성(Consistency) : 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.
    • 트랜잭션을 진행하는 동안 데이터가 변경되더라도, 업데이트된 데이터베이스로 트랜잭션을 진행하는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행한다.
  • 독립성(Isolation) : 둘 이상의 트랜잭션이 실행되고 있을 경우, 어떤 하나의 트랜잭션이라도 다른 트랜잭션 연산에 끼어들 수 없다.
  • 지속성(Durability) : 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다.

Spring에서의 트랜잭션 처리 방법

스프링에서는 트랜잭션 처리를 지원하는데, 선언적 트랜잭션과 어노테이션을 통한 트랜잭션이 있다.
그 중 어노테이션 방식으로 @Transactional을 선언하는 방법이 일반적이며, 선언적 트랜잭션이라고 부른다.
클래스 혹은 메서드 위에 @Transactional이 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성된다. 이 프록시 객체는 @Transactional이 포함된 메소드가 호출될 경우, PlatformTransactionManager을 사용해 트랜잭션을 사용하고, 정상 여부에 따라 Commit 혹은 Rollback한다.

스프링 트랜잭션 속성

isolation(격리 수준)

트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준을 말한다.

  • DEFAULT : 기본 격리 수준(기본설정, DB의 isolation 레벨을 따름)
  • READ_UNCOMMITED (level 0) : 커밋되지 않은(즉, 트랜잭션 처리중인) 데이터에 대한 읽기를 허용
  • READ_COMMITTED (level 1) : 트랜잭션이 커밋된 확정 데이터만 읽기 허용
  • REPEATABLE_READ (level 2) : 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸려 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.(같은 데이터를 두 번 쿼리 했을 때 일관성 있는 결과 리턴)
  • SERIALIZABLE (level 3) : 데이터의 일관성 및 동시성을 위해 MVCC를 사용하지 않음. 트랜잭션이 완료될 때 까지 SELECT 문장이 사용하는 모든 데이터에 shared 락이 걸려 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능

propogation (전파옵션)

트랜잭션 동작 도중 다른 트랜잭션을 호출(실행)하는 상황에 선택할 수 있는 옵션이다. @Transactionalpropagation 속성을 통해 피호출 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수 있고, 새롭게 트랜잭션을 생성할 수도 있다.

  • REQUIRED : 디폴트 속성, 부모 트랜잭션 내에 실행하며, 부모 트랜잭션이 없을 경우 새로운 트랜잭션 생성
  • SUPPORTS : 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 진행한다.
  • REQUIRES_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션 생성
  • MANDATORY : REQUIRED와 비슷하지만, 시작된 트랜잭션이 없으면 예외를 발생시킨다. 혼자서는 독립적으로 트랜잭션을 실행하면 안 되는 경우에 사용한다.
  • NOT_SUPPORTED : 트랜잭현을 사용하지 않는다. 이미 진행 중인 트랜잭션이 있으면 보류시킨다.
  • NEVER : 트랜잭션을 사용하지 않도록 강제한다. 이미 진행중인 트랜잭션도 존재하지 않는다(있을 경우 예외 발생)
  • NESTED : REQUIRED와 동일하게 작동하지만 SAVEPOINT를 지정한 시점까지 롤백이 가능하다.

timeout

지정한 시간 내에 해당 메소드 수행이 완료되지 않을 경우 rollback 수행
@Transactional(timeout = 10)


oksusutea's blog

꾸준히 기록하려고 만든 블로그