Computer Sciences/Database

14. Transaction

jeidiiy 2021. 5. 22. 17:52

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를 읽는 동작
  • 일반적인 상황에서는 하면 안 되는 행위