Computer Science/DB

[DB] 트랜잭션(1) - 정의, ACID, 상태, 문법, 예외

깨구르르 2024. 3. 13. 12:47
728x90

1. 정의

  • 사전적 의미: 거래
  • CS 분야에서의 의미: 더이상 분할이 불가능한 업무처리의 단위
    👉 한꺼번에 수행되어야 할 일련의 연산 모음

 

만약,
계좌이체 시 인출에는 성공했는데
입금에 실패하면?

👉 경제적 손실이라는 치명적인 결과

👉 이 두 과정은 동시에 성공하든지 동시에 실패해야 함

👉 이 과정을 동시에 묶는 방법이 바로 트랜잭션

 

START TRANSACTION
	-- 이 사이의 명령어들은 하나의 명령어처럼 처리됨
    -- 성공 or 실패 둘 중 하나
    A의 계좌로부터 인출;
    B의 계좌로 입금;
COMMIT

👉 데이터 거래에 있어서 안전성을 확보하기 위한 방법.

  • 오류가 발생 시 결과 재반영 X, 모든 작업을 원상태로 복구
  • 처리 과정이 모두 성공했을 때만 그 결과를 반영

 

 


 

 

2. 특징 (ACID)

Atomicity 원자성

  • 정의: 트랜잭션이 데이터베이스에 모두 반영되든가 아니면 전혀 반영되지 않아야 한다는 것
  • 트랜잭션 단위로 데이터가 처리되지 않는다면
    👉 데이터 처리 시스템을 이해하기 힘듦
    👉 오작동 했을 시 원인을 찾기가 힘듦

 

Consistency 일관성

  • 정의: 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 함
  • DB가 변경되더라도 업데이트된 DB로 트랜잭션이 진행되는 것이 X
    💡 처음에 트랜잭션을 진행하기 위해 참조한 DB로 진행

 

Isolation 독립성

  • 정의: 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없
  • 하나의 특정 트랜잭션이 완료될 때까지 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없음

 

Durabiliy 영구성

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

 

 


 

 

3. 상태

 

활성 Active

 

  • 정의: 트랜잭션이 정상적으로 실행중인 상태
  • 트랜잭션이 시작되면 해당 트랜잭션의 상태는 활동 상태가 됨
  • 설계자가 설계한 대로 연산들이 정상적으로 실행중인 상태를 의미함

 

성공

 

  • 부분 완료 Partially Committed
    : 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태
    • 작업이 성공했다고 해서 무조건 반영하는 것이 아니라, 설계자의 최종 승인이 있을 때까지 실제 DB에 작업 내용을 반영하지 않고 기다리고 있는 상태
  • 완료 Committed
    : 트랜잭션 성공이 종료되어 Commit 연산을 실행한 후의 상태
    • 설계자가 작업 결과에 대하여 반영을 승인한다면 트랜잭션이 성공적으로 종료

 

실패

 

  • 실패 Failed
    : 트랜잭션 실행오류가 발생하여 중단된 상태
  • 철회 Aborted
    : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
    • 설계되어 있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 Rollback 연산을 수행한 상태

 

 


 

 

4. 문법

Commit
  • 정의: 모든 작업들을 정상 처리하겠다고확정하는 명령어
  • 해당 처리 과정을 DB에 영구 저장
  • Commit을 수행하면 하나의 트랜잭션 과정이 종료되는 것. 이전 데이터가 완전히 반영되어 UPDATE
START TRANSACTION; -- 트랜잭션 시작

-- id = 1인 사람의 잔액에서 -500000
UPDATE account set amount = amount - 500000 where id = 1;

-- id = 2인 사람의 잔액에 +500000
UPDATE account set amount = amount - 500000 where id = 2;

-- 이체 이력 저장
INSERT INTO TransferHistory (from_id, to_id, amount, trans_date)
VALUES(1, 2, 500000, now());

COMMIT; -- 트랜잭션을 DB에 적용

-- 적용된 결과 조회
SELECT * from account;
SELECT * from TransferHistory;

 

Rollback
  • 정의: 작업 중 문제가 발생되어 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어
  • 해당 명령을 트랜잭션에게 하달하면, 트랜잭션은 시작되기 이전의 상태로 돌아감 (= 마지막 Commit을 완료한 시점으로 돌아감)
START TRANSACTION; -- 트랜잭션 시작

INSERT INTO members VALUES('곽', '두팔', '서울시', '강남구', '대한민국');
SELECT * FROM members; -- 변경된 상태 보여줌

ROLLBACK; -- 트랜잭션을 취소하고 START TRANSACTION 실행 전 상태로 롤백함

SELECT * FROM members;
더보기

MYSQL 기본 Commit 방식을 바꿀 수 있음

MYSQL에서는 디폴트로 auto commit이 on으로 설정되어 있음

세미콜론을 찍을 때마다 DB에서 자동으로 commit됨

  • 0은 auto commit Off
  • 1은 auto commit On
-- 오토커밋 off
SET AUTOCOMMIT = 0;

-- 오토커밋 on
SET AUTOCOMMIT = 1;

-- 오토쿼리 설정 확인
SELECT @@autocommit;

 

 


 

 

5. Rollback 예외

  • 모든 명령어에 대하여 트랜잭션의 롤백 명령이 적용되는 것은 아님
  • DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 대상이 아님

 

 


 

 

출처

더보기
728x90