[SQLP]2장 LOCK과 트랜잭션 동시성 제어-2.트랜잭션

Yu River·2022년 11월 1일
0

SQL전문가가이드

목록 보기
17/34

[1] ⭐️ 트랜잭션의 특징

(1) 원자성(Atomicity)

  • 트랜잭션은 더 이상 분해가 불가능한 업무의 최소단위이다.
  • 따라서 트랜잭션은 전부 처리되거나 아예 하나도 처리되지 않아야 한다.(All OR Nothing)

(2) 일관성(Consistency)

  • 일관된 상태의 데이터베이스에서 하나의 트랜잭션을 성공적으로 완료하고 나면
    그 데이터베이스는 여전히 일관된 상태여야 한다.

(3) 격리성(Isolation)

  • 실행 중인 트랜잭션의 중간 결과를 다른 트랜잭션이 접근할 수 없다.

(4) 영속성(Durability)

  • 트랜잭션이 일단 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장된다.

[2] ⭐️ 트랜잭션 격리성

(1) 낮은 단계의 격리성 수준에서 발생할 수 있는 현상들

1. Dirty Read

  • 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것을 의미한다.
  • 변경 후 아직 커밋되지 않은 값을 읽었는데 변경을 가한 트랜잭션이 최종적으로 롤백된다면
    그 값을 읽은 트랜잭션은 비일관된 상태에 놓이게 된다.

2. Non-Repetable Read

  • 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에
    두 쿼리 결과가 다르게 나타나는 현상이다.

3. Phantom Read

  • 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가
    두 번째 쿼리에서 나타나는 현상

[예시] TX1 트랜잭션이 지역별고객과 연령대별고객을 연속해서 집계하는 도중에 새로운 고객이 TX2 트랜잭션에 의해 등록하는 경우

지역별고객과 연령대별 고객 두 집계 테이블을 통해 총고객수를 조회하면 서로 결과 값이 다르다.

(2) ⭐️ 트랜잭션 격리성 수준(Transaction Isolation Level)

1. Read Uncommitted

  • 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.

2. Read Committed

  • 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함으로써 Dirty Read를 방지한다.
  • 커밋된 데이터만 읽더라도 Non-Repeatable Read와 Phantom Read 현상을 막지는 못한다.

3. Repeatable Read

  • 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지한다.
  • 트랜잭션 격리성 수준이 Phantom Read인 현상은 막을 수 없다.

4. Serializable Read

  • 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때
    • 첫 번째 쿼리에 있던 레코드가 사라지지 않는다.
    • 첫 번째 쿼리에 있던 값이 바뀌지 않는다.
    • 새로운 레코드가 나타나지도 않는다.
    • 즉, 트랜잭션 격리성 수준이 Phantom Read를 방지할 수 있다.

(3) Oracle과 SQL Server에서의 트랜잭션 격리성

1.모든 DBMS가 4가지 레벨을 다 지원하지 않는다.

SQL Server와 DB2는 4가지 레벨을 다 지원한다.

오라클은 Read Committed와 Serializable Read만 지원한다.

  • Oracle에서 Repeatable Read를 구현하려면 for update 구문을 이용하면 된다.

2. 대부분의 DBMS는 Read Committed를 기본 트랜잭션 격리성 수준으로 사용한다.

3. 다중 트랜잭션 환경에서 DBMS가 제공하는 기능

  • 동시성을 제어하려면 트랜잭션 시작 전에 명시적으로 SET TRANSACTION 명령어를 수행하면 된다.

SQL SERVER

set transaction isolation level read serializable;

ORACLE

alter session set isolation_level = serializable;

(4) Locking 매커니즘의 단점과 대안

1. Locking 매커니즘

  • 트랜잭션 격리성 수준을 Repeatable Read나 Serializable Read로 올리기 위해 사용한다.

[예시] Repeatable Read 모드에서 실행하는 경우

  • T1 시점의 쿼리에서 설정한 공유 Lock을 T6 시점까지 유지한다.
  • 이 때 TX2의 Update는 T6 시점까지 대기가 발생한다.
  • 이는 Locking 매커니즘이 적용된 결과라고 볼 수 있다.

2. Locking 매커니즘의 단점

  • 위와 같이 수행할 경우 동시성이 떨어진다.
    • 다른 트랜잭션이 대기를 해야하기 때문이다.

3. Locking 매커니즘의 대안 : ⭐️ 다중 버전 동시성 제어

  • '스냅샷 격리성 수준(Snapshot Isolation Level)'이라고도 한다.
  • 현재 진행 중인 트랜잭션에 의해 변경된 데이터를 읽고자 할 때는 변경 이전 상태로 되돌린 버전을 읽는다.
  • 변경이 아직 확정되지 않은 값을 읽으려는 것이 아니므로 공유 Lock을 설정하지 않아도 된다.
    • 이로 인해 읽는 세션과 변경하는 세션이 서로 간섭현상을 일으키지 않는다.
profile
도광양회(韜光養晦) ‘빛을 감추고 어둠속에서 힘을 기른다’

0개의 댓글