CS/Database

트랜잭션(Transaction)

jinsang-2 2025. 2. 18. 16:17

트랜잭션(Transaction)이란??

트랜잭션은 데이터베이스에서 수행되는 "작업의 논리적 단위"를 말한다.

“더 이상 분할이 불가능한 업무처리의 단위”라고도 말한다. 하나의 작업을 위해 더 이상 분할될 수 없는 명령들의 모음이며 즉 한꺼번에 수행되어야 할 일련의 연산모음을 의미한다.

이 모든 작업이 완료되거나(Commit), 실패하여 취소(Abort)되어야 한다.

  • 참고
    • 예를 들어 SELECT문, INSERT문 이렇게 명령문마다 하나씩 트랜잭션의 작업의 단위가 아니라는 것
    • 작업 단위는 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미
    • 트랜잭션의 작업의 단위는 SQL 한 문장이 아님!!
  • 예시 : 은행 계좌 이체(A계좌→B계좌)
    1. 계좌 A에서 100만원 출금
    2. 계좌 B로 100만원 입금
    이 두 작업은 하나의 트랜잭션으로 처리되어야 한다.
START TRANSACTION
    -- 이 블록안의 명령어들은 마치 하나의 명령어 처럼 처리됨
    -- 성공하던지, 다 실패하던지 둘중 하나가 됨.
    A의 계좌로부터 인출;
    B의 계좌로 입금;
COMMIT

트랜잭션의 특징 4가지(ACID)

1. 원자성(Atomicity)

트랜잭션은 모두 실행되거나 모두 실행되지 않아야 한다 !

  • 트랜잭션은 사람이 설계한 논리적인 작업 단위이기에, 일 처리는 작업 단위별로 이루어져야 다루는데 무리가 없음
데이터베이스에서 테이블의 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면, 결과를 재반영 하는 것이 아니라 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성공하였을때 만 그 결과를 반영한다.
  • 예시 : A계좌에서 B계좌로 계좌 이체할 때 출금과 입금 작업 중 하나라도 실패하면 전체 트랜잭션이 취소된다.

2. 일관성(Consistency)

트랜잭션이 수행된 후 데이터는 항상 일관된 상태를 유지해야 한다.

  • 예를 들어 “계좌 잔액은 마이너스가 되면 안 된다, 상품 재고는 음수가 될 수 없다.” 같은 제약 조건들이 항상 지켜져야 한다.

3. 독립성(Isolation)

둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다.

  • 예시 : 다른 트랜잭션이 계좌 A의 잔액을 읽는 경우, 트랜잭션 완료 전에는 변경 사항을 볼 수 없어야 한다.

4. 지속성(Durability)

트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다.

  • 예시 : 계좌 이체가 완료되면 시스템 장애가 발생하더라도 변경 내용이 영구적으로 보존되어야 한다.

트랜잭션 상태

 

활성(Active)

트랜잭션이 시작되어 작업을 수행 중인 상태

  • 트랜잭션이 아직 완료되지 않았으며, 중간에 데이터베이스에 변경 작업(insert, update 등)을 수행할 수 있다.

부분 완료(Partially Committed)

트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태

  • 모든 쿼리가 실행이 완료된 상태지만 아직 DB에 영구적으로 반영되지 않음(commit 전)
  • 데이터베이스가 모든 작업이 완료되었는지, 시스템에 오류는 없는지 확인

완료 (Committed)

  • 트랜잭션이 성공적으로 완료되고 DB에 영구적으로 반영된 상태
  • 이후 트랜잭션 결과를 다른 트랜잭션에서도 볼 수 있다.

실패 (Failed)

  • 트랜잭션 실행 중 오류가 발생하거나 조건을 만족하지 못해 중단된 상태
  • 롤백(rollback)할 준비

철회 (Aborted)

  • 트랜잭션이 실패한 후, 데이터베이스가 트랜잭션의 모든 변경 작업을 취소하고 초기 상태로 복구한 상태
  • 롤백(rollback)이 완료된 상태