본문 바로가기
개발 관련/java

Transactional 정리

by lazysnack 2022. 7. 14.

Q. 스프링 프레임워크에서는 트랜잭션을 처리할 때 @Trasnactional 을 사용하는데, 이 @Transactional 어노테이션에는 7가지 전파 방법이 있다, 어떤 것들이 있는가?

A. @Transactional 어노테이션을 사용하면 적용된 클래스 또는 메소드에 트랜잭션이 적용된다. 따라서 클래스에 할 것인지, 메소드에 할 것인지 판단을 잘 해야 한다. 7가지 Propagation(전파) 방법은

  1. REQUIRED : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다.
  2. REQUIREDS_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성된다.
  3. SUPPORT : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 nontransactionally 로 실행된다.
  4. MANDATORY : 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생한다.
  5. NOT_SUPPORT : nontransactionally 로 실행되며 부모 트랜잭션 내에서 실행된 경우 일시 정지한다.
  6. NEVER : nontransactionally 로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생한다.
  7. NESTED : 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있다. 둘러싼 트랜잭션이 없을 경우 REQUIRED 와 동일하게 작용한다.

propagation 을 따로 설정하지 않았을 경우 default 값은 REQUIRED 이다.

  • 추가적으로 트랜잭션 하면 같이 나오는 말이 isolation (격리) 레벨에 대한 얘기인데, 나온 김에 같이 정리하자면

    1. READ_UNCOMMITTED (level 0)

      • 트랜잭션이 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
    2. READ_COMMITTED (level 1) - default

      • dirty read 를 방지하여 트랜잭션이 커밋되어 확정된 데이터만을 읽는 것을 허용한다.
      • ex) A사용자가 데이터를 수정하고 있는 동안 B사용자는 데이터에 접근할 수 없다.
      dirty read 란? 
      
      트랜잭션에서 처리하는 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상이며, READ_UNCOMMITTED (level 0) 에서만 발생한다.
    3. REPEATABLE_READ (level 2)

      • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock 이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다
      • 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두번 쿼리했을 때 일관성 있는 결과를 리턴한다.
    4. SERIALIZABLE (level 3)

      • 완벽한 읽기 일관성 모드를 제공한다.
      • 데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control - 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회 시 LOCK 을 사용하지 않고 데이터의 버전을 관리해 데이터의 일관성 및 동시성을 높이는 기술) 을 사용하지 않는다.
      • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock 이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.

'개발 관련 > java' 카테고리의 다른 글

자바 비동기 (1)  (0) 2022.07.14
캡슐화(encapsulation)  (0) 2022.07.14
멀티쓰레드에서 Thread-Safe 방법  (0) 2022.07.14
orElse 와 orElseGet 무슨 차이가 있을까?  (0) 2022.07.14
SimpleJdbcInsert 문제  (0) 2022.07.14