2025. 10. 16. 14:31ㆍDB
트랜잭션 · SAVEPOINT · LOCK 실습 정리
이번 글에서는 MySQL 환경에서 트랜잭션(Transaction), SAVEPOINT, 그리고 LOCK 제어를 직접 실습한 과정을 정리합니다.
트랜잭션의 흐름, 부분 롤백, 커밋, 자동 커밋(auto commit) 제어, 그리고 Row-level Lock까지 단계별로 다뤄보겠습니다.
❶ 실습 환경 세팅
CREATE DATABASE test;
USE test;
CREATE TABLE customer (
customer_id INT NOT NULL,
customer_nm VARCHAR(45) NOT NULL,
PRIMARY KEY (customer_id)
);
INSERT INTO customer VALUES (1, '홍길동');
INSERT INTO customer VALUES (2, '이길동');
INSERT INTO customer VALUES (3, '삼길동');
SELECT * FROM customer;
👉 기본 데이터 삽입 후 테이블 상태
| customer_id | customer_nm |
|---|---|
| 1 | 홍길동 |
| 2 | 이길동 |
| 3 | 삼길동 |
---
❷ 자동 커밋(AUTOCOMMIT) 제어
SELECT @@autocommit; -- 기본값 1 (true)
SET autocommit = 0; -- 자동 커밋 비활성화
SELECT @@autocommit; -- 0 (false)
자동 커밋을 끄면, SQL 실행 시점에 바로 저장되지 않고 명시적인 COMMIT 명령을 해야 데이터가 반영됩니다.
---
❸ 트랜잭션 + SAVEPOINT 실습
INSERT INTO customer VALUES (4, '지누');
COMMIT;
INSERT INTO customer VALUES (5, '오길동');
SAVEPOINT s1;
INSERT INTO customer VALUES (6, '육길동');
ROLLBACK TO s1;
UPDATE customer SET customer_nm = '오길동2' WHERE customer_id = 5;
COMMIT;
🔍 실행 결과
| customer_id | customer_nm |
|---|---|
| 1 | 홍길동 |
| 2 | 이길동 |
| 3 | 삼길동 |
| 4 | 지누 |
| 5 | 오길동2 |
ROLLBACK TO s1은 SAVEPOINT 이후의 작업만 되돌리므로,
(6, 육길동)은 취소되고, 오길동 수정만 남게 됩니다.
---
❹ 외부 스키마에서 트랜잭션 테스트
USE madang;
SELECT * FROM book WHERE bookid = 1;
START TRANSACTION;
UPDATE book SET price = 7000 WHERE bookid = 1;
COMMIT;
START TRANSACTION 이후 커밋 전까지는 변경이 다른 세션에 보이지 않습니다. 커밋이 이루어져야 비로소 모든 사용자에게 반영됩니다.
---
❺ LOCK(Row-level Lock) 실습
UPDATE book SET price = price + 100 WHERE bookid = 2;
이 명령이 실행되는 동안 bookid=2 행은 배타 잠금(Exclusive Lock, X-lock)이 걸립니다.
다른 세션에서 같은 행을 수정하려 하면 잠금이 해제될 때까지 대기하게 됩니다.
즉, MySQL InnoDB는 Row-level Lock을 사용해 특정 행만 잠그고, 나머지 데이터는 동시에 접근할 수 있도록 합니다. 이는 동시성 제어(Concurrency Control)를 향상시키는 핵심 메커니즘입니다.
---

❻ 정리
- 트랜잭션(Transaction): 논리적 작업 단위 (All or Nothing)
- SAVEPOINT / ROLLBACK TO: 트랜잭션 중간 지점 설정 및 부분 되돌리기
- AUTOCOMMIT: 자동 커밋 모드 제어
- COMMIT: 변경사항 영구 반영
- LOCK: 동시성 제어를 위한 자원 접근 제한
- Row-level Lock: 특정 행만 잠그는 효율적인 잠금 방식
이번 실습을 통해 MySQL이 어떻게 트랜잭션의 일관성을 보장하고, 여러 사용자가 동시에 데이터를 수정하더라도 서로의 작업이 꼬이지 않게 제어하는지 확인할 수 있었습니다.
'DB' 카테고리의 다른 글
| [LG U+ 유레카 3기] 트랜잭션 고립수준과 의도락 · 회복 정리 (0) | 2025.10.16 |
|---|---|
| [LG U+ 유레카 3기] Deadlock & 2단계 로킹 실습 (0) | 2025.10.16 |
| [LG U+ 유레카 3기]데이터베이스 속성의 종류: 단순·복합·단일값·다중값·저장·유도 수업 정리 (0) | 2025.10.15 |
| 인덱스) B-tree VS B+tree (0) | 2025.09.30 |
| [Oracle SQL] DDL/DML/TCL/DCL 복습 정리] (0) | 2025.06.26 |