[SpringBoot] @Transactional 설정 - 격리 수준

해니·2024년 10월 29일
0

SpringBoot

목록 보기
23/24
post-thumbnail

트랜잭션의 격리 수준(Transaction Isolation Level)

  • 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것
  • 격리(고립) 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED가 존재한다.

SERIALIZABLE

  • 가장 엄격한 격리 수준으로, 트랜잭션을 순차적으로 진행시킨다.
  • 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다.
  • 순수한 SELECT 작업에서도 대상 레코드에 넥스트 키 락을 읽기 잠금(공유락, Shared Lock)을 건다.
  • 가장 안전하지만 가장 성능이 떨어지므로, 극단적으로 안전한 작업이 필요한 경우가 아니라면 사용해서는 안된다.

REPEATABLE READ

  • MVCC(Multi Version Concurrency Control) 방식

    • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여, 트랜잭션ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
    • 일반적인 RDBMS는 변경 전의 레코드를 Undo 공간에 백업해두고 실제 레코드 값을 변경한다.
      • 백업된 데이터는 불필요하다고 판단되는 시점에 주기적으로 삭제된다.
      • Undo에 백업된 레코드가 많아지면, 처리 성능이 떨어질 수 있다.
  • 유령 읽기(Phantom Read)

    • SELECT로 조회한 경우 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견되는 현상
    • MVCC 덕분에 일반적인 조회에서는 발생하지 않는다.
    • MySQL 기준 , SELECT 이후 SELECT FOR UPDATE 한 경우 발생한다.

READ COMMITTED

  • COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다.
  • Phantom Read에 더해 Non-Repeatable Read(반복 읽기 불가능) 문제까지 발생한다.
    • 반복 읽기를 수행하면 다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라질 수 있다.

READ UNCOMMITTED

  • 어떤 트랜잭션의 변경 내용이 COMMIT되든 ROLLBACK 되든 상관없이, 다른 트랜잭션에서 조회 할 수 있다.
  • 더티 리드가 허용되는 격리 수준
    • 더티 리드 : 어떤 트랜잭션에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상
  • RDBMS 표준에서 인정하지 않을 정도로 정합성에 문제가 많은 격리 수준이다.



@Transactional 세부 설정


격리 수준 설정

@Transactional(isolation=Isolation.DEFAULT)
@Transactional(isolation=Isolation.READ_COMMITTED)

  • DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 중 하나로 설정할 수 있다.
  • 기본 격리 수준은 DEFAULT로 설정되어 있다.
    • datastore(database)에 기본 격리 수준을 따른다는 것을 의미한다.



DB 별 기본 격리 수준

: 대부분의 DBREAD_COMMITTED을 기본 격리수준으로 설정하고 있다.

  • MySQL 8.0 -> REPEATABLE_READ

  • Oracle DB 21c -> READ_COMMITTED

  • PostgreSQL 15 -> READ_COMMITTED

  • MongoDB 6 -> READ_UNCOMMITTED






출처

[DB / Spring ] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
MySQL의 트랜잭션 격리 수준과 스프링의 @Transactional 기본 격리 수준(Isolation Level)
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
트랜잭션의 격리 수준(isolation Level)이란?
트랜잭션을 사용할 때 각 DB들의 기본 격리 수준은 무엇일까?

profile
💻 ⚾️ 🐻

0개의 댓글