트랜잭션은 일련의 SQL 명령어를 하나의 논리적 처리 단위로 묶는 기능으로, 모든 연산이 성공하거나 전부 실패해야 하며, 중간 상태에서 멈출 수 없습니다. 예를 들어 은행 이체 시 출금과 입금이 모두 완료되거나, 둘 다 실패해야 데이터 일관성이 유지됩니다. MySQL에서는 기본적으로 InnoDB와 BDB 같은 특정 스토리지 엔진만이 트랜잭션을 지원합니다.
트랜잭션은 여러 작업을 원자적으로 처리할 수 있게 해주며, 오류 발생 시 이전 상태로 되돌릴 수 있어 데이터 무결성을 보장합니다.
- 트랜잭션의 4대 특성 (ACID)
- 원자성 (Atomicity): 트랜잭션 내 모든 작업은 모두 성공하거나 모두 실패해야 합니다. 중간에 오류가 발생하면 전체 트랜잭션이 롤백되어 처음 상태로 복귀됩니다.
- 일관성 (Consistency): 트랜잭션 시작 전후로 데이터베이스의 정합성이 유지되어야 합니다. 제약 조건, 참조 무결성 등 모든 규칙이 지켜져야 합니다.
- 격리성 (Isolation): 여러 트랜잭션이 동시에 실행될 때, 서로의 작업이 영향을 주지 않도록 보장합니다. 격리 수준은
READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE로 나뉩니다. - 지속성 (Durability): 트랜잭션이 커밋되면 변경된 데이터는 영구적으로 저장되며, 시스템 장애나 재시작에도 영향을 받지 않습니다.
- 트랜잭션 구현 준비
다음은 테스트용 환경을 구성하는 예제입니다.
-- 데이터베이스 생성
CREATE DATABASE transaction_test;
USE transaction_test;
-- 사용자 정보 테이블 생성
CREATE TABLE user_info (
user_id INT PRIMARY KEY,
user_name VARCHAR(20)
);
- 트랜잭션 제어 명령어
| 명령어 | 설명 |
|---|---|
SET autocommit = 0; |
자동 커밋 비활성화 (수동 컨트롤) |
SET autocommit = 1; |
자동 커밋 활성화 |
BEGIN; 또는 START TRANSACTION; |
트랜잭션 시작 |
SAVEPOINT savepoint_name; |
현재 위치를 저장점으로 설정 |
ROLLBACK TO savepoint_name; |
특정 저장점으로 롤백 |
ROLLBACK; |
트랜잭션 시작 지점까지 전체 롤백 |
COMMIT; |
현재 트랜잭션을 확정하고 저장 |
트랜잭션 내에서 실행된 모든 명령어는 커밋 또는 롤백 전까지 메모리상에서 관리됩니다.
- 실습: 트랜잭션 동작 테스트
-- 트랜잭션 시작
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명령어가 무효화됩니다.