[DBMS]트랜잭션(Transaction) - ACID

Date:     Updated:

카테고리:

태그:

[20] 트랜잭션(Transaction)

20.1. 트랜잭션(Transaction)

  • DBMS에서 논리적 연산단위.
    • 더 이상 나눌 수 없는 작업의 단위
      • 분할할 수 없는 최소의 단위
        • 전부 적용하거나 전부 취소한다.
        • Transaction은 ALL or NOTHING의 개념이다.
    • INSERT, UPDATE, SELECT, DELETE가 각각 하나의 트랜잭션에 해당된다.
    • 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함된다.
  • 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구한다.
  • 예를 들면, 이체를 할 때 한 계좌에서 인출되면 다른 계좌에서 입금이 확인되는 것이 중요하다.
    • 출금(UPDATE) -> 돈 -> 입금(UPDATE)이 하나의 Tx으로 묶여야 된다.
  • 만약 쿼리 하나가 실패하면, DBMS은 전체 트랙잭션 또는 실패한 쿼리를 롤백한다.
    • 개발방식에 따라 다를 수 있다.
      • ‘모’ 아니면 ‘도’ (둘 다 성공하던가, 하나만 실패해도 취소)
    • 트랜잭션은 Commit 전에 언제든지 수동으로 Rollback 될 수 있다.
  • AOP와 비슷하다.

20.2. 트랜잭션의 4대 특징 (ACID)

  • 원자성 (Atomicity)
    • 나눌 수 없는 하나의 작업으로 다뤄져야한다.
    • 트랜잭션에서 정의된 연산들은 모두 성공적으로 끝나거나 모두 실패해야 한다.
    • COMMIT : 조작 과정에 문제 없으면 처리 확정. 작업 내용을 DB에 영구적으로 저장.
    • ROLLBACK : 조작 중간에 문제 발생 시 마지막 커밋으로 복귀. 최근 변경사항을 취소.
  • 일관성 (Consistency)
    • 트랜잭션이 실행되기 전의 데이터베이스의 내용이 잘못되어 있지 않다면 실행된 이후에서 데이터베이스의 내용이 잘못이 있으면 안된다.
    • 데이터 조작 전후에 일관성 유지 필요하다.
      • Tx 수행 전과 후가 일관된 상태를 유지해야한다.
    • 예) 회원 가입시 등록번호에 유일성 제약 설정
  • 고립성 (Isolation, 격리성)
    • 각 Tx는 독립적으로 수행되어야 한다.
    • 복수 사용자가 동시에 데이터 조작 실행할 경우 각각의 처리가 모순없이 실행되는 것을 보증한다.
    • 데이터베이스 오브젝트에 대해 잠금을 걸어 후속 처리 차단한다.
      • Isolation Level이 너무 높으면 다른 작업을 하는 사람은 기다려야하는 상황이 발생
    • 직렬화 가능 기능(직렬 상태로 복수 트랜잭션 순서대로 처리)
      • DBMS내에서 트랜잭션 격리 수준 설정으로 구현한다.
    • 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.
  • 지속성(Durability)
    • 데이터 조작 완료 후 완료 통지 받는 시점에서 결과 잃지 않는 것을 말한다.
    • 트랜잭션이 Commit 되고나면 데이터 변경 사항이 영구적으로 확정되도록 보장하는 것이다.

20.3. COMMIT

  • 입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 COMMIT 명령어를 통해서 트랜잭션을 완료할 수 있다.
  • COMMIT이나 ROLLBACK 이전의 데이터 상태
    • 단지 메모리 BUFFER에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구 가능하다.
    • 현재 사용자는 SELECT문장으로 결과를 확인 가능하다.
    • 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다.
    • 변경된 행은 잠금(LOCKING)이 설정되어서 다른 사용자가 변경할 수 없다.
  • COMMIT 이후의 상태
    • 데이터에 대한 변경 사항이 데이터베이스에 반영된다.
    • 이전 데이터는 영원히 잃어버리게 된다.
    • 모든 사용자는 결과를 볼 수 있다.
    • 관련된 행에 대한 잠금(LOCKING)이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.

20.4. ROLLBACK

  • 테이블 내 입력한 데이터나 수정한 데이터나 삭제한 데이터에 대하여 COMMIT 이전에는 변경사항을 취소할 수 있다.
  • 데이터베이스에서는 롤백(ROLLBACK) 기능을 사용한다.
  • 데이터 변경사항이 취소되어 데이터의 이전 상태로 복구되며, 관련된 행에 대한 잠금(LOCKING)이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게된다.

20.5. SAVE POINT

  • 저장점을 정의하면 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 SAVEPOINT까지 트랜잭션의 일부만 롤백할 수 있다.
  • 복잡한 대규모 트랜잭션에서 에러가 발생했을 때 SAVEPOINT까지의 트랜잭션만 롤백하고 실패한 부분에 대해서만 다시 실행한다.

20.6. 자동커밋, 수동커밋

  • Auto commit이 기본이다.
  • 자동 커밋 - 명령 실행 후, 자동으로 커밋이 수행 (Rollback 불가)
  • 수동 커밋 - 명령 실행 후, 명시적으로 COMMIT 또는 ROLLBACK을 입력

20.7. Tx의 Isolation Level

  • 각 Tx을 고립시키는 정도를 말한다.
    • read uncommited
      • 커밋되지 않은 데이터도 읽기 가능
      • 트랜잭션에서 처리 중인 아직 commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
      • 격리 수준이 가장 낮은 단계
    • read commited
      • 커밋된 데이터만 읽기 가능 (phantom read)
      • 트랜잭션이 commit 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다.
    • repeatable read
      • 반복 읽기, Tx이 시작된 이후 변경은 무시된다.
      • 트랜잭션 내에서 쿼리를 두번 이상 수행할 때, 첫번재 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지한다.
    • serializable
      • 한번에 하나의 Tx만 독립적으로 수행한다.
      • 직렬화가 될수록 성능은 떨어지고, 품질은 높아진다.
        • DBMS 운영 시 동시성이 크게 떨어지면서 성능상 이슈가 발생한다.
      • 가장 이상적인 격리 수준의 보장

20.8. 트랜잭션 요점

  • 테이블에 데이터의 변경을 발생시키는 입력(INSERT), 수정(UPDATE), 삭제(DELETE) 수행 시 그 변경되는 데이터의 무결성을 보장하는 커밋(COMMIT)과 롤백(ROLLBACK)의 목적.
  • 커밋은 “변경된 데이터를 테이블에 영구적으로 반영해라”라는 의미를 갖는 것이다.
  • 롤백은 “변경 전으로 복귀하라”라는 의미이다.
  • 저장점(SAVEPOINT)은 “데이터 변경을 사전에 지정한 저장점까지만 롤백하라”는 의미이다.
  • 트랜잭션의 대상이 되는 sql 문장을 실행하면 자동으로 시작되고, Commit 또는 Rollback을 실행한 시점에 종료된다.

DBMS 카테고리 내 다른 글 보러가기

댓글 남기기