[Spring] Transaction(트랜잭션)

[Spring] Transaction(트랜잭션)

트랜잭션은 데이터베이스의 데이터를 수정할 때 예외가 발생하여 의도하지 않은 결과가 발생하는 것을 막기위해 사용된다.

트랜잭션 특징

Atomicity(원자성): 하나의 트랜잭션으로 지정된 작업들을 모두 성공적으로 실행되거나 모두 실행되지 않는다. Consistency(일관성): 트랜잭션은 일관적인 데이터베이스를 유지한다. Isolation(격리성): 각각의 트랜잭션들이 독립적으로 사용되어 서로 영향을 끼치지 않는다. Durability(지속성): 트랜잭션이 완료되면 결과는 데이터베이스에 저장된다.

@Transactional

스프링에서는 @Transactional 어노테이션을 사용해서 트랜잭션을 적용할 수 있다.

@Transactional @Service public class ModelServiceImpl implements ModelServcie { @Autowired private ModelRepository modelRepository; @Transactional public Model updateModel(Model model){ modelRepository.save(model); } }

트랜잭션 어노테이션 설정 우선순위: 메소드 > 클래스 > 인터페이스의 메소드 > 인터페이스

@Transaction 은 AOP Proxy를 통해서 처리된다. 프록시는 @Transaction으로 설정된 메소드를 호출하면 정상적으로 실행되면 commit, 정상적으로 실행되지 않으면 rollback을 수행한다.

격리 수준(Isolation)

DEFAULT: 기본설정, 데이터베이스의 격리 수준을 따른다.

READ_UNCOMMITTED(level 0): 커밋되지 않은 데이터에 대한 읽기 허용

READ_COMMITTED(level 1): 트랜잭션이 커밋된 데이터만 읽기 허용

REPEATABLE_READ(level 2): 트랜잭션이 완료 될 때까지 select 문장이 사용하는 모든 데이터에 shared lock하여 수정 불가

SERIALIZABLE(level 3): 트랜잭션이 완료될 때까지 select 문장이 사용하는모든 데이터에 shared lock하여 수정, 입력 불가

전파(Propagation)

PROPAGATION_REQUIRED: 부모 트랜잭션이 존재할 경우 부모 트랜잭션 실행, 존재하지 않는 경우 새로운 트랜잭션 실행(JPA 기본 설정)

PROPAGATION_SUPPORTS: 부모 트랜잭션이 존재할 경우 부모트랜잭션 실행, 존재하지 않는 경우 트랜잭션 실행하지 않음

PROPAGATION_REQUIRES_NEW: 부모 트랜잭션에 상관없이 새 트랜잭션 실행, 부모 트랜잭션이 존재할 경우 부모 트랜잭션 중지

PROPAGATION_NOT_SUPPORTED: 부모 트랜잭션에 상관없이 트랜잭션 실행하지 않음, 부모 트랜잭션이 존재할 경우 부모 트랜잭션 중지

PROPAGATION_NEVER: 항상 트랜잭션 실행하지 않음, 부모 트랜잭션이 존재할 경우 Exception

참고

반응형

from http://zzzinho.tistory.com/117 by ccl(A) rewrite - 2021-12-28 14:27:51