TRANSACTION

  • 정의
    • DB에서 하나의 작업으로 처리되는 논리적 작업 단위
    • DBMS의 Concurrency control과 Recovery에서 중요한 역할을 수행

1. ACID Property

  • Atomicity: all or nothing. 하나의 단위로 처리되어야 함. (중간까지만 처리됨은 불가)
  • Consistency: 데이터베이스의 일관성(무결성)을 깨지 않아야 함
  • Isolation: 다른 Transaction과 동시에 수행되더라고 독립적으로 영향을 받지 않아야 함
  • Durability: 한번 수행 완료(Commit)되면 영원히 반영되어 있어야 함

2. 구성

  • DML(INSERT, UPDATE, DELETE)의 집합
  • DDL이나 DCL은 한 문장이 트랜잭션으로 처리됨

3. 트랜잭션 정의

  • 시작
    • 명시적인 트랜잭션 시작 명령 없음 (ORACLE)
      • 타 DBMS에서는 트랜잭션 시작을 명시함(MSSQL은 BEGIN TRAN으로 시작함)
    • 첫 DML이 시작되면 트랜잭션 시작
  • 명시적 종료: COMMIT/ROLLBACK
  • 묵시적 종료
    • DDL, DCL 등이 수행될때(automatic commit)
    • SQL *PLUS 등에서의 정상적 종료(automatic commit)
    • 시스템 오류(automatic rollback)

4. State of Data

4.1 Before Commit/Rollback

  • 현재 사용자는 DML의 결과를 볼 수 있음
  • 다른 사용자는 현재 DML 결과를 볼 수 없다(변경 이전 버전이 보임. Read Consistency)
  • DML에 의해 변경된 모든 row는 Lock이 걸림(다른 트랜잭션에서 수정 불가)

4.2 After Commit

  • 변경이 영속적으로 DB에 반영됨. 이전 상태는 사라짐(더 이상 Rollback 불가)
  • 변경 결과를 모든 사용자가 볼 수 있음
  • 모든 Lock이 풀림, 모든 Savepoint 사라짐

4.3 After Rollback

  • 모든 DML의 변경이 취소됨
  • 모든 Lock이 풀림, 모든 Savepoint 사라짐

5. Isolation Level

  • 여러 사용자가 동일한 데이터를 동시에 접근할때 발생하는 상황에 처리를 어떻게 할 것인지 정하는 격리 수준

5.1 Read Uncommitted (Level 0)

  • SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리 않는 Level
  • 각 트랜재잭션이 COMMIT이나 ROALLBACK 여부에 상관 없이 데이터를 읽을 수 있음
  • DIRTY READ 현상 발생
    • 트랜잭션의 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상

5.2 Read Committed (Level 1)

  • SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 Level
  • SQL Server가 디폴트로 사용하는 Level
  • Dirty Read 현상 해결
  • Non-Repeatable Read 현상이 발생
    • 하나의 트랜잭션내에서 똑같은 SELECT을 실행했을 때 항상 같은 결과를 가져오지 못하는 현상

5.3 Repeatable Read

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level
  • 트랜잭셔마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 됨
  • PHANTOM READ 현상이 발생
    • 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다하는 현상
    • 이를 방지하기 위해서는 쓰기 잠금을 걸어야 함

5.4 SERIALIZABLE

  • 트랜잭션이 끝날 때까지 조회, 생성, 수정, 삭제하는 것을 막음

  • 가장 엄격한 격리 수준으로 성능 측면에서 처리 서능이 낮음

6. Deadlock

  • 둘 이상의 트랜잭션이 서로 상대방의 Lock을 순환 대기하여 어떤 트랜잭션도 더 이상 진행할 수 없는 상태
  • Oracle이 주기적으로 자동 detect하여 에러를 돌려줌