Transaction이란?
데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
Transaction의 기본 로직은 2개 이상의 쿼리를 하나의 커넥션으로 묶어 DB에 전송하고, 이 과정에서 에러가 발생할 경우 자동으로 모든 과정을 원래대로 되돌려 놓는다. 이러한 과정을 구현하기 위해 Transaction은 하나 이상의 쿼리를 처리할 때 동일한 Connection 객체를 공유한다.
Spring Transaction
Spring은 코드 기반의 트랜잭션(Programmatic Transaction) 처리 뿐만 아니라 선언적 트랜잭션(Declarative Transaction)을 지원한다.
Spring이 제공하는 트랜잭션 템플릿 클래스를 이용하거나 설정파일, 어노테이션을 이용해서 트랜잭션의 범위 및 규칙을 정의할 수 있다.
Spring에서는 주로 선언적 트랜잭션을 이용하는데,
퀴리문을 처리하는 과정에서 에러가 났을 경우 자동으로 Rollback 처리한다.
Spring Transaction의 세부설정 | |
---|---|
Isolation(격리수준) | 트랜잭션에서 일관성이 없는 데이터를 허용하는수준 -DEFAULT -READ_UNCOMMITTED(dirty read 발생) -READ_COMMITTED (dirty read 방지) -REPEATABLE_READ(Non-Repeatable Read 방지) -SERIALIZABLE (Phantom Read 방지) 예시: @Transactional(isolation=Isolation.DEFAULT) |
Propagation(전파수준) | 트랜잭션 동장 도중 다른트랜잭션을 호출하는 상황 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법에 대해 결정하는 설정값. -REQUIRED -SUPPORTS(시작된TRX가 있으면 그안에서 자식TRX포함) -REQUIRES_NEW(무조건 새로운 TRX생성) -NESTED(중첩TRX 실행-부모TRX와 독립적으로..) |
ReadOnly | 트랜잭션을 읽기 전용 속성으로 지정 예시: Transactional(readOnly=true) |
Rollback Exception | 예외가 발생했을때 트랜잭션 롤백 시킬경우를 설정@Transactional(isolation=rollbackFor=Exception.class) @Transactional(isolation=noRollbackFor=Exception.class) |
Timeout | 일정시간 내에 트랜잭션 끝내지 못하면 롤백@Transactional(timeout=10) |