OS

OS 트랜잭션(transaction), 격리수준(Isolation Level)

1. Transaction(트랜잭션)

트랜잭션의 성질

  1. 원자성(Atomicity)

    한 트랜잭션 내에서 실행한 작업들을 하나로 간주한다. 즉, 모두 성공 또는 실패를 뜻합니다.

  2. 일관성(Consistency)

    트랜잭션은 일관성 있는 데이터베이스 상태를 유지합니다. (Data Integrity)

  3. 격리성(Isolation)

    동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야합니다.

  4. 지속성(Durability)

    트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 합니다.

트랜잭션이란 무엇인가?

스프링에서는 트랜잭션을 처리를 지원하는데 그 중 어노테이션 방식으로 @Transcational을 선언하여 사용하는 방법이 일반적입니다. 즉, 선언적 트랜잭션이라 불리어옵니다.

클래스나 메서드 위에서 @Transaction이 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성됩니다.

이 프록시 객체는 @Transcation이 포함된 메소드가 호출 될 경우, PlatformTranscationManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit or Rollback을 진행합니다.

2. 트랜잭션 경쟁시 문제점

다수의 트랜잭션이 동시에 실행되는 상황에서는 트랜잭션 처리방식을 고려해야합니다.

2.1. 문제 1Dirty Read

트랜잭션 A가 어떤 값을 1에서 2로 변경하고 아직 커밋되지 않은 상황에서 트랜잭션 B가 같은 값을 읽는 경우 트랜잭션 B는 2가 조회됩니다.

트랜잭션 B가 2를 조회한 후 A가 롤백이 된다면 결국 트랜잭션 B는 잘못된 값을 읽게됩니다. 즉, 트랜잭션이 완료되지 않은 시점에서 데이터에 접근을 허용할 경우 발생할 수 있는 데이터 불일치가 발생할 수 있습니다.

2.2. 문제 2 Non Repeatable Read

트랜잭션 A가 어떤값을 1을 읽은후 A는 같은 쿼리를 또 실행할 예정이면 그 사이에 트랜잭션 B가 값 1을 2로 바꾸고 커밋해버리면서 A가 같은 쿼리 두번을 날리는 사이 두 쿼리의 결과가 다르게 되어버립니다.

즉, 트랜잭션에서 같은 쿼리를 두번 실행했을 때 발생할 수 있는 데이터 불일치 입니다.

Dirty Read에 비해서 발생할 확률은 적습니다.

2.3. 문제 3 Phantom Read

트랜잭션 A가 어떤 조건을 사용하여 특정 범위의 값 [0,1,2,3,4]를 읽었을 때, 이후 A가 같은 쿼리를 실행예정이라면 그 사이에 트랜잭션 B가 같은 테이블에 값[5,6,7]을 추가해버리면 A가 같은 쿼리 두번을 날리는 사이에 두 쿼리의 결과가 다르게 되어버립니다.

즉, 한 트랜잭션에서 일정 범위의 레코드를 두번 이상 읽을 때 발생하는 데이터 불일치라고 할 수 있습니다.

3. 트랜잭션 격리 수준

격리수준이란 일관성이 없는 데이터를 허용하는 수준을 말합니다.

3.1. DEFAULT

기본 격리수준을 뜻하며 기본값을 뜻합니다. = Database의 Isolation Level을 따릅니다.

3.2. READ_UNCOMMITED(level 00)

커밋되지 않은(트랜잭션 처리)중인 데이터에 대한 읽기를 허용

즉 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommited 혹은 Dirty) 데이터 B를 읽을 수 있습니다.

Problem1 - Dirty Read가 발생할 수 있습니다.

Transaction 레벨을 허용하지 않아[ READ_COMMITTED와 SERIALIZABLE만이 적합한 트랜잭션 레벨입니다 ] 라는 오류가 발생한다. 다른 옵션들은 문제 발생하지 않습니다.

3.3. READ_COMMITED(Level01)

트랜잭션 커밋이 된 확정 데이터만 읽기를 허용합니다. 그리고 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른사용자는 해당 데이터에 접근할 수 없습니다.

Problem1 - Dirty Read방지

3.4. REPEATABLE_READ(Level02)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능합니다.

선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제가 불가능 하기때문에 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴합니다.

Problems2 - Non Repeatable Read 방지

3.5. SERIALIZABLE(Level 03)

데이터의 일관성 및 동시성을 위해 MVCC(Multi Version COncurrency Control)을 사용하지 않습니다.

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능합니다.

problem3 - phantom READ 방지

주의 할점

격리 수준이 올라갈 수록 성능 저하의 우려를 가지고 있습니다.

MVCC?

MVCC는 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회시 LOCK을 사용하지 않고 데이터의 버전을 관리해 데이터의 일관성 및 동시성을 높이는 기술입니다.

트랜잭션이 완료 될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능합니다.

REFERENCE

https://goddaehee.tistory.com/167