MySQL 트랜잭션의 개념과 활용

트랜잭션은 일련의 SQL 명령어를 하나의 논리적 처리 단위로 묶는 기능으로, 모든 연산이 성공하거나 전부 실패해야 하며, 중간 상태에서 멈출 수 없습니다. 예를 들어 은행 이체 시 출금과 입금이 모두 완료되거나, 둘 다 실패해야 데이터 일관성이 유지됩니다. MySQL에서는 기본적으로 InnoDB와 BDB 같은 특정 스토리지 엔진만이 트랜잭션을 지원합니다.

트랜잭션은 여러 작업을 원자적으로 처리할 수 있게 해주며, 오류 발생 시 이전 상태로 되돌릴 수 있어 데이터 무결성을 보장합니다.

  1. 트랜잭션의 4대 특성 (ACID)
  • 원자성 (Atomicity): 트랜잭션 내 모든 작업은 모두 성공하거나 모두 실패해야 합니다. 중간에 오류가 발생하면 전체 트랜잭션이 롤백되어 처음 상태로 복귀됩니다.
  • 일관성 (Consistency): 트랜잭션 시작 전후로 데이터베이스의 정합성이 유지되어야 합니다. 제약 조건, 참조 무결성 등 모든 규칙이 지켜져야 합니다.
  • 격리성 (Isolation): 여러 트랜잭션이 동시에 실행될 때, 서로의 작업이 영향을 주지 않도록 보장합니다. 격리 수준은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE로 나뉩니다.
  • 지속성 (Durability): 트랜잭션이 커밋되면 변경된 데이터는 영구적으로 저장되며, 시스템 장애나 재시작에도 영향을 받지 않습니다.
  1. 트랜잭션 구현 준비

다음은 테스트용 환경을 구성하는 예제입니다.

-- 데이터베이스 생성
CREATE DATABASE transaction_test;
USE transaction_test;

-- 사용자 정보 테이블 생성
CREATE TABLE user_info (
    user_id INT PRIMARY KEY,
    user_name VARCHAR(20)
);
  1. 트랜잭션 제어 명령어
명령어 설명
SET autocommit = 0; 자동 커밋 비활성화 (수동 컨트롤)
SET autocommit = 1; 자동 커밋 활성화
BEGIN; 또는 START TRANSACTION; 트랜잭션 시작
SAVEPOINT savepoint_name; 현재 위치를 저장점으로 설정
ROLLBACK TO savepoint_name; 특정 저장점으로 롤백
ROLLBACK; 트랜잭션 시작 지점까지 전체 롤백
COMMIT; 현재 트랜잭션을 확정하고 저장

트랜잭션 내에서 실행된 모든 명령어는 커밋 또는 롤백 전까지 메모리상에서 관리됩니다.

  1. 실습: 트랜잭션 동작 테스트
-- 트랜잭션 시작
BEGIN;

-- 첫 번째 사용자 삽입
INSERT INTO user_info VALUES (1, '김철수');
SELECT * FROM user_info;
-- 결과: (1, '김철수')

-- 저장점 설정
SAVEPOINT step_1;

-- 두 번째 사용자 삽입
INSERT INTO user_info VALUES (2, '박영희');
SELECT * FROM user_info;
-- 결과: (1, '김철수'), (2, '박영희')

-- 저장점 step_1으로 롤백
ROLLBACK TO step_1;

-- 현재 상태 확인
SELECT * FROM user_info;
-- 결과: (1, '김철수') - 두 번째 항목이 삭제됨

-- 전체 트랜잭션 롤백
ROLLBACK;

-- 데이터가 없음을 확인
SELECT * FROM user_info;
-- 결과: 빈 결과 세트

-- 다시 트랜잭션 시작 후 데이터 추가
BEGIN;
INSERT INTO user_info VALUES (3, '이민호');

-- 새로운 저장점 설정
SAVEPOINT final_step;

INSERT INTO user_info VALUES (4, '최지영');

-- 최종 커밋
COMMIT;

-- 최종 결과 확인
SELECT * FROM user_info;
-- 결과: (3, '이민호'), (4, '최지영')

⚠️ 주의: 저장점을 통해 롤백한 이후에는 그 저장점 이후의 저장점은 더 이상 사용할 수 없습니다. 또한, 트랜잭션이 이미 커밋되었거나 종료된 후에는 ROLLBACK 명령어가 무효화됩니다.

태그: MySQL InnoDB 트랜잭션 ACID 저장점

6월 13일 20:47에 게시됨