Spring-boot: @Transactional
- 스프링의 트랜잭션 지원
- 스프링은 코드 기반의 트랜잭션 처리(Programmatic Transaction) 뿐만 아니라 선언적 트랜잭션(Declarative Transaction)을 지원하고 있다. 스프링이 제공하는 트랜잭션 템플릿 클래스를 이용하거나 설정 파일, 어노테이션을 이용해서 트랜잭션의 범위 및 규칙을 정의할 수 있다.
- 선언적 트랜잭션 처리
- 선언적 트랜잭션은 설정 파일이나 어노테이션을 이용해서 트랜잭션의 범위, 롤백 규칙 등을 정의
@Transactional
- 보통 Service나 Service 내부의 메소드에 선언하는 어노테이션
- @Transactional 메소드 내부에서 Entity를 수정하게 되면 dirty checking을 통해 자동으로 DB에 반영된다.
- @Transactional 메소드가 정상적으로 종료되지않으면 DB에 반영되지 않는다. (Atomicity 보장)
- @Transactional(readonly=true) 로 설정할 경우 Entity를 수정해도 DB에 저장하지 않는다.(readonly의 default는 false 값이다.)
- 서로 다른 두 쓰레드가 @Transactional 메소드를 통해 동일 Entity에 접근한다면 lock을 걸어서 동시에 접근할 수 없게 한다. (Isolation 보장)
- 서로 다른 두 쓰레드가 @Transaction(readonly=true) 메소드를 통해 동일 Entity에 접근한다면 lock을 걸 필요는 없다. (읽기만 하기 때문에)
스프링에서는 @Transactional 어노테이션을 통해 메소드에서 접근한 Entity의 원자성(Atomicity), 독립성(Isolation)을 보장해준다.
(학습중인 내용이기 때문에 내용이 부정확할 수 있습니다. 추후에 업데이트할 예정입니다.)