트랜잭션의 개념
트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻하고, 아래와 같은 성질을 가진다.
- Atomicity(원자성) : 각 트랜잭션이 성공/실패하는 단일 단위로 처리되도록 보장한다.
- Consistency(일관성) : 모든 데이터는 규칙에 맞는 일관성을 보장한다. (제약조건, 트리거 등의 모든 규칙에 유효해야 한다)
- Isolation(고립성) : 트랜잭션은 다른 트랜잭션의 영향을 받지 않는다.
- Durability(지속성) : 트랜잭션이 성공하면 그 결과는 영구적으로 저장된다.
트랜잭션의 전파
트랜잭션 전파는 어떤 트랜잭션이 동작중인 과정에서 다른 트랜잭션을 실행할 경우 '어떻게 처리하는가'에 대한 개념이다.
트랜잭션의 전파 설정은 '@Transactional'의 옵션 'propagation'을 통해 설정할 수 있고, 이에 따라 달라지게된다.
propagation의 각 옵션에 대해 알아보자
- .Propagation.REQUIRED (기본 값)
@Transactional(propagation = Propagation.REQUIRED)
public void doSomething() { ... }
기본적으로 해당 메서드를 호출한 곳에서 별도의 트랜잭션이 설정되어 있지 않았다면 트랜잭션를 새로 시작한다. (새로운 연결을 생성하고 실행한다.) 만약, 호출한 곳에서 이미 트랜잭션이 설정되어 있다면 기존의 트랜잭션 내에서 로직을 실행한다. 예외가 발생하면 롤백이 되고 호출한 곳에도 롤백이 전파된다.
- Propagation.REQUIRES_NEW
Propagation.REQUIRES_NEW로 설정되었을 때에는 매번 새로운 트랜잭션을 시작한다. (기존 트랜잭션이 존재하는 경우 트랜잭션을 잠시 보류시킨다.) 만약, 호출한 곳에서 이미 트랜잭션이 설정되어 있다면 기존의 트랜잭션은 메서드가 종료할 때까지 잠시 대기 상태로 두고 자신의 트랜잭션을 실행한다.
부모 트랜잭션에서 예외가 발생하더라도 자식 트랜잭션은 롤백되지않지만, 자식 트랜잭션에서 예외가 발생한다면 부모트랜잭션까지 롤백이 전파된다.
- Propagation.NESTED
앞서 설명한 Propagation.REQUIRED와 동일하게 작동한다. 중요한 차이점은, SAVEPOINT를 지정한 시점까지 부분 롤백이 가능하다는 것이다.
- Propagation.MANDATORY
해당 메서드를 호출한 곳에 별도의 트랜잭션이 설정되어 있지 않다면 예외를 발생시킨다.
- Propagation.SUPPORTS
해당 메서드를 호출한 곳에서 별도의 트랜잭션이 설정되어 있다면 합류한다. 진행중인 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.
- Propagation.NOT_SUPPORTS
해당 메서드를 호출한 곳에서 별도의 트랜잭션이 설정되어 있다면 보류한다. 진행중인 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.
- Propagation.NEVER
트랜잭션을 생성하지 않는다. (기존 트랜잭션도 허용하지 않는다)
출처
'Spring boot > Spring 개념' 카테고리의 다른 글
Spring과 POJO (0) | 2023.05.01 |
---|---|
Spring Filter vs Interceptor vs AOP (0) | 2023.05.01 |
Servlet과 Front Controller (0) | 2023.05.01 |
Spring DI(Dependency Injection) (0) | 2023.04.24 |
Spring Bean (0) | 2023.04.24 |