본문 바로가기

CS/데이터베이스

트랜잭션 개념과 ACID 원칙

728x90

트랜잭션

트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위를 의미합니다.
모든 작업이 성공적으로 완료되거나, 하나라도 실패하면 전체가 무효화(rollback) 되어야 합니다.
즉, 데이터의 정합성과 신뢰성을 보장하기 위한 핵심 메커니즘입니다.

ACID 원칙

원자성 (Atomicity)

트랜잭션 내의 모든 작업은 전부 수행되거나 전부 취소되어야 하며, 중간 상태는 존재하지 않는다.

일관성 (Consistency)

트랜잭션 수행 전과 후에 데이터는 정의된 규칙(무결성 제약 등) 을 항상 만족해야 한다.

고립성 or 격리성 (Isolation)

동시에 실행되는 트랜잭션 간에는 서로 간섭 없이 독립적으로 수행되어야 한다.

지속성 (Durability)

트랜잭션이 커밋되면 그 결과는 시스템 장애가 발생해도 영구적으로 유지되어야 한다.

ACID 원칙은 데이터 무결성과 동시성 제어를 보장하기 위해 반드시 필요합니다.
다수의 사용자와 시스템이 동시에 접근하는 환경에서도 일관된 결과를 제공합니다.
예기치 못한 시스템 장애나 오류 상황에서도 데이터가 손상되지 않도록 보호합니다.
결과적으로, 신뢰성 높은 애플리케이션을 구축하기 위한 기본 설계 원칙입니다.

아래는 MySQL에서 트랜잭션과 ACID 원칙을 적용한 예제 코드입니다.

-- 트랜잭션 시작
START TRANSACTION;

-- 예시 테이블 CREATE
CREATE TABLE posts {
    id INT PRIMARY KEY,
    title VARCHAR(100), 
    contents VARCHAR(100)
};

-- 첫 번째 INSERT
INSERT INTO posts (id, title, contents)
VALUES (1, '게시글1', '내용1');

-- 두 번째 INSERT
INSERT INTO posts (id, title, contents)
VALUES (2, '게시글2', '내용2');

-- COMMIT을 실행하지 않고 롤백 테스트를 위한 에러 발생
INSERT INTO posts (id, title, contents)
VALUES (1, '게시글3', '내용3');

-- 트랜잭션 커밋
COMMIT;

먼저 START TRANSACTION; 을 시작으로 트랜잭션을 시작하며, 이후의 모든 쿼리는 하나의 작업 단위로 묶여 처리 됩니다.

CREATE TABLE posts (...);
INSERT INTO posts (id, title, contents) VALUES (1, ...);
INSERT INTO posts (id, title, contents) VALUES (2, ...);

여기까지는 트랜잭션 안에서 정상적인 작업들이 순차적으로 수행됩니다. 아직은 커밋되지 않았기 때문에 물리적인 저장은 확정되지 않았습니다.

INSERT INTO posts (id, title, contents) VALUES (1, '게시글3', '내용3');

여기서 중복된 id = 1로 인한 PRIMARY KEY 충돌 오류가 발생하며 트랜잭션이 실패합니다.
이 순간까지의 모든 작업은 트랜잭션 안에서 처리 중이므로, 아직 데이터베이스에 반영되지 않았고, 자동으로 롤백(rollback) 됩니다.
만약 정상적으로 모든 작업이 수행되었을 경우, 이 커밋 명령 COMMIT; 으로 데이터가 영구 반영됩니다.
하지만 위 예시에서는 오류가 발생했기 때문에 커밋 이전에 트랜잭션이 중단되고, 아무 데이터도 남지 않습니다.

핵심 요약

  • 트랜잭션은 모든 작업이 성공해야만 반영되는 안전장치다.
  • ACID 원칙을 통해 데이터 무결성, 장애 복구 능력, 동시성 처리를 보장한다.
  • 예시처럼 중간에 오류가 발생하면, 이전 작업들도 모두 되돌아간다 (rollback)
    --> 원자성의 전형적인 예

ref

AI가 알려주는 MySQL - 데이터 마스터로 가는 첫걸음

728x90