on
[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