[JPA] Transactional

Hyunho·2021년 7월 20일
0

@Transactioal

Transaction
데이터베이스의 상태를 변경하는 작업 또는 수행되는 연산들을 의미하며, begin, commit을자동 수행하고 예외가 발생하면 rollback처리를 수행합니다.

@Transactional
스프링에서는 어노테이션 방식으로 @Transactional을 클레스, 메소드에 선언하여 사용하며, 선언된 곳에는 트렌잭션 프록시 객체가 생성됩니다.

@Transactional(readOnly = true)  (1)
public class MemberService {
  @Transactional // default => readOnly = false
  public void join(Member member) {
    memberRepository.save(member); (2)
  }
}

@Transactional(readOnly = true) 를 선언하면 읽기 전용으로 변경 감지, 세션 플러시, 스냅샷 생성을 비활성 합니다. 또한 DB부하 분산이 필요할때 읽기전용 DB를 선택할 수 있어 성능 향상을 가질 수 있습니다.

DB Connection
DB커넥션은 transaction 시작 시점에 획득하게 됩니다.
auto-commit 설정을 하지 않으면 기본 값으로 true가 설정되어 있는 상태입니다.
true 상태에서 위에 에플리케이션이 실행되고 위 코드가 동작하면 (1)시점에 DB 커넥션을 획득하게 되고 (2)시점에 DB 커넥션을 사용하게 됩니다.

JPA의 변경감지는 transaction이 commit될때 작동되며, Spring은 @transactional을 선언한 메서드가 실행되기전, transaction begin 코드를 삽입 하며 메서드가 실행된 후, transaction commit코드를 삽입하여, 객체 변경감지를 수행하게 유도한다

profile
hyunho

0개의 댓글