14. Transaction

2021. 5. 22. 17:52Computer Sciences/Database

ACID

Atomicity

  • 트랜잭션은 모두 수행되던가 아예 실행되지 않아야 함

Consistency

  • 트랜잭션의 작업 수행 후에 일관성을 유지해야 함

Isolation

  • 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우에 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들지 못함

Durability

  • 트랜잭션이 성공적으로 완료됐을 경우, 그 결과는 영구적으로 반영되어야 함

Concurrency(동시성)

  • 동시에 여러 작업을 수행하는 특성
  • 동시에 여러 작업이 같은 공간에 접근하면 Conflict 발생(e.g. 예약 시스템)
  1. 서울의 A와 부산의 B가 대전에서 열리는 콘서트 예매를 하려 함
  1. 둘 다 동시에 페이지에 접근하여 두 사람 모두 현재 공석으로 표시됨
  1. 둘 다 같은 자리에 예매하게 되었으나, 논리적으로는 문제 없음
  1. 결국 둘은 같은 자리의 예메 티켓을 들고 콘서트를 가게됨
  • 이러한 문제를 트랜잭션을 통해 해결할 수 있음

Serializability

  • 같은 데이터베이스의 함수 연산 실행이 다른 함수의 실행이 완전히 종료된 후에 실행되도록하는 것
  • 실행 시간은 겹칠 수 있지만 실행은 연속적으로(순차적으로) 실행되는 경우 그 실행은 serializable 하다고 함

Atomicity

  • 둘 이상의 작업을 거의 동시에 수행할 경우 발생할 수 있는 비시리얼화된 동작 외에도, 작업이 실행되는 동안 하드웨어 또는 소프트웨어 충돌이 발생할 경우 단일 작업이 데이터베이스를 허용할 수 없는 상태로 설정하는 것이 가능함

Transaction

  • 직렬화와 원자성 문제를 해결하는 방법은 그룹 연산을 트랜잭션으로 만드는 것
  • 트랜잭션은 반드시 atomically하고 serializably하게 실행되어야 하는 하나 이상의 연산의 컬렉션

Transaction Properties(ACID)

  • Atomicity: 프로그래머가 트랜잭션 바운더리를 명시하거나 해야 함
    • START TRANSACTION
    • COMMIT / ROLLBACK
  • Isolation: 프로그래머가 격리성 레벨을 명시하거나 해야 함
    • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (SQL 표준 기본값)
    • SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    • SET TRANSACTION ISOLATION LEVEL READ COMMITED; (많은 DBMS의 기본값)
    • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  • Consistency: DBMS에서 처리
  • Durability: DBMS에서 처리

Start Transaction

  • BEGIN TRANSACTION
  • START TRANSACTION

End Transaction

  • COMMIT : 성공적으로 트랜잭션을 마무리하는 키워드. COMMIT이 수행되면 되돌릴 수 없음
  • ROLLBACK : 트랜잭션을 취소하거나 불완전하게 중지하는 키워드

Auto-Commit Mode(Default mode of PostgreSQL)

  • 각 SQL 문을 트랜잭션으로 실행함
  • 이 모드에서 COMMIT을 미루기 위해서는 반드시 BEGIN or START TRANSACTION SQL 명령을 입력해야 함
    • SQL 명령은 사용자가 정확히 COMMIT 또는 ROLLBACK을 발행할 때까지 커밋되거나 버려지지 않음
    • 또한 커밋하기 전에 세션을 exit하면 작업을 모두 잃어버릴 수 있음

Non-Auto-Commit Mode

  • 사용자가 직접 트랜잭션을 제어하는 모드
  • 트랜잭션은 어느 SQL(DML and DDL) 문이 시작됐을 때 시작됨
  • 사용자는 반드시 트랜잭션을 정확히 끝내야 함
    • COMMIT
      • 현재 트랜잭션이 시작된 이후 데이터베이스에 대한 변경사항이 영구적으로 반영됨
      • COMMIT 문이 실행되기 전에, 변경사항은 잠재적이며, 다른 트랜잭션에 보일 수도 있고 그렇지 않을 수도 있음
    • ROLLBACK
      • 트랜잭션의 SQL 문의 응답으로 변경된 사항을 취소함

Read-Only Transaction

  • READ만 수행하는 트랜잭션을 수행할 경우 다음 키워드를 추가하여 사용할 수 있음
SET TRANSACTION READ ONLY;
  • Start Transaction 이후 처음으로 입력해야 함

Read-Write Transaction

  • READ, WRITE를 수행하는 트랜잭션인 경우 다음과 같이 사용할 수 있음
  • 이 옵션은 디폴트 값이므로 불필요한 설정임
SET TRANSACTION READ WRITE;

Isolation Level

단계가 내려갈수록 속도가 빨라지고 동시성 증가, 하지만 오류 발생확률 증가

  • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (SQL 표준 기본값)
    • Phantom tuple 금지
      • 현재 트랜잭션 진행 중 다른 유저가 데이터를 삽입, 삭제하는 경우가 있음
      • 이때 트랜잭션 수행 중 데이터 조회 시 데이터가 갑자기 생기거나 사라지는 튜플을 말함
      • 즉, 현재 수행 중인 트랜잭션에서 사용 중인 데이터만을 사용하도록 하는 것
    • Dirty reads 금지
    • Reads are repeatable
      • 현재 트랜잭션 내에서 데이터를 수정하기 전에는 항상 같은 데이터를 읽음
    • 동시성에 관한 문제가 절대 일어나지 않음
    • 그만큼 속도가 느림
    • 돈을 다루거나 생명과 직결된 시스템의 경우 반드시 이 레벨을 사용해야 함
  • SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    • Phantom tuple 허용
    • Dirty reads 금지
    • Reads are repeatable
  • SET TRANSACTION ISOLATION LEVEL READ COMMITTED; (많은 DBMS의 기본값)
    • Phantom tuple 허용
    • Dirty reads 금지
    • Reads are not repeatable
    • 대부분의 DBMS가 속도를 위해 이 레벨을 기본값으로 사용함
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    • Phantom tuple 허용
    • Dirty reads 허용
    • Reads are not repeatable
    • 전문가가 아니면 건들지 않은 편이 좋음

Dirty Data

  • 커밋되지 않은 트랜잭션에 의해 쓰여진 데이터를 부르는 일반적인 용어

Dirty Reads

  • 다른 트랜잭션의 Dirty Data를 읽는 동작
  • 일반적인 상황에서는 하면 안 되는 행위

 

'Computer Sciences > Database' 카테고리의 다른 글

16. Primary and foreign Key Constraint  (0) 2021.05.29
15. Index and View  (0) 2021.05.23
13. Database Modifications  (0) 2021.05.22
12. Aggregation and window function  (0) 2021.05.16
11. Set and Subquery  (0) 2021.05.16