[LG U+ 유레카 3기]트랜잭션 · SAVEPOINT · LOCK 실습 정리

2025. 10. 16. 14:31DB

트랜잭션 · 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이 어떻게 트랜잭션의 일관성을 보장하고, 여러 사용자가 동시에 데이터를 수정하더라도 서로의 작업이 꼬이지 않게 제어하는지 확인할 수 있었습니다.