MySQL에서 데이터 무결성을 보장하기 위해 사용하는 트랜잭션은 BEGIN 또는 START TRANSACTION으로 시작된다.
하지만 이 트랜잭션을 실제 데이터베이스에 영구적으로 반영하기 위해 반드시 필요한 명령어가 바로 COMMIT이다.
COMMIT 명령어란?
COMMIT은 현재 트랜잭션에서 수행한 모든 변경 사항을 확정하여 실제 데이터베이스에 영구 저장하는 명령어이다.
트랜잭션은 기본적으로 메모리 상의 임시 상태이며, COMMIT을 실행해야만 변경 내용이 반영된다.
즉, COMMIT은 작업을 완전히 저장하겠다는 확정의 의미로 사용된다.
COMMIT;
트랜잭션은 COMMIT으로 끝나야 의미가 있으며, 중간에 오류가 발생하거나 문제가 생기면 ROLLBACK으로 취소할 수 있다.
이러한 구조는 트랜잭션의 4대 특성(ACID) 중 지속성(Durability)을 구현하는 핵심이다.
왜 COMMIT이 중요한가?
트랜잭션에서 COMMIT을 실행하지 않으면, 그동안 수행된 모든 변경 작업은 데이터베이스에 저장되지 않는다.
특히 다음과 같은 경우 COMMIT은 매우 중요하게 작용한다.
- 사용자 계좌 이체, 재고 처리 등 일괄 데이터 처리
- 수백 개의 테이블을 동시에 갱신해야 하는 대규모 연산
- 오류 발생 시 전체 되돌리기(Rollback) 가능성을 보장하기 위해
실무에서는 COMMIT의 위치가 잘못되면 데이터 정합성 오류, 중복 저장, 처리 누락 등의 심각한 문제가 발생할 수 있다.
autocommit 설정과 COMMIT의 관계
MySQL에서는 기본적으로 autocommit = 1 설정이 되어 있다.
이 경우 모든 DML 명령어는 자동으로 COMMIT이 실행되므로, 수동 트랜잭션 제어가 불가능하다.
따라서 COMMIT을 제대로 사용하기 위해서는 다음과 같이 autocommit을 비활성화해야 한다.
SET autocommit = 0;
START TRANSACTION;
-- 여러 작업 수행
COMMIT;
이렇게 하면 COMMIT을 호출하기 전까지는 변경 내용이 실제 테이블에 반영되지 않는다.
실전 예제 1 – 은행 계좌 이체 처리
SET autocommit = 0;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100000 WHERE account_id = 'A001';
UPDATE accounts SET balance = balance + 100000 WHERE account_id = 'B001';
COMMIT;
위 코드는 A001 계좌에서 B001 계좌로 10만원을 이체하는 로직이다.
중간에 오류가 발생하면 ROLLBACK으로 되돌릴 수 있으며, 문제가 없을 때 COMMIT을 실행하면 실제 계좌 잔액이 변경된다.
실전 예제 2 – INSERT, UPDATE 복합 처리
START TRANSACTION;
INSERT INTO orders (order_id, user_id, total_price) VALUES (1001, 2, 79000);
UPDATE users SET point = point + 790 WHERE user_id = 2;
COMMIT;
이 예제는 주문 정보를 삽입하고, 사용자에게 적립 포인트를 추가하는 예제이다.
주문이 실패했을 경우 포인트만 증가하는 오류를 방지하려면 COMMIT 전까지는 모든 작업을 보류해야 한다.
실전 예제 3 – 조건부 COMMIT 처리
START TRANSACTION;
UPDATE products SET stock = stock - 2 WHERE product_id = 300;
-- 재고가 0 이상일 경우에만 COMMIT
IF (SELECT stock FROM products WHERE product_id = 300) >= 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
실무에서는 특정 조건에 따라 COMMIT을 실행하거나 취소하는 로직이 자주 사용된다.
MySQL에서는 이처럼 프로그래밍 흐름과 연동하여 트랜잭션을 세밀하게 제어할 수 있다.
COMMIT 사용 시 주의할 점
- COMMIT을 호출하지 않으면 트랜잭션은 끝나지 않는다.
일정 시간이 지나면 세션이 자동 종료되며 잠금(lock) 문제가 발생할 수 있다. - COMMIT 이후에는 ROLLBACK이 불가능하다.
→ 한번 저장된 데이터는 되돌릴 수 없으므로 반드시 확인 후 실행해야 한다. - COMMIT 위치는 업무 로직의 가장 마지막에 두는 것이 좋다.
COMMIT vs ROLLBACK
구분 | COMMIT | ROLLBACK |
역할 | 변경사항을 영구 저장 | 변경사항을 모두 취소 |
실행 타이밍 | 작업이 정상적으로 끝난 후 | 오류 발생 시 |
복구 가능성 | 불가능 | 가능 (COMMIT 전까지) |
사용 빈도 | 높은 편 | 예외적 상황에서 사용 |
트랜잭션의 성패를 가르는 기준이 바로 COMMIT과 ROLLBACK이며, 적절한 시점에 실행하는 것이 트랜잭션 설계의 핵심이다.
요약
- COMMIT은 트랜잭션을 데이터베이스에 확정 반영하는 명령어이다.
- 실무에서는 반드시 SET autocommit = 0을 설정하고 사용할 것.
- COMMIT 이후에는 롤백이 불가능하므로 사용 시 주의가 필요하다.
- 트랜잭션은 COMMIT으로 마무리되어야 의미가 있다.
공식 문서 참고
- MySQL COMMIT 공식 문서
https://dev.mysql.com/doc/refman/8.0/en/commit.html
'DB' 카테고리의 다른 글
[MySQL] RELEASE SAVEPOINT 완벽 가이드 사용법(SAVEPOINT 삭제) (0) | 2025.06.18 |
---|---|
[MySQL] ROLLBACK TO SAVEPOINT 완벽 가이드 사용법(SAVEPOINT 까지 롤백) (1) | 2025.06.18 |
[MySQL] SAVEPOINT 완벽 가이드 사용법(트랜잭션 중간 지점 저장) (1) | 2025.06.17 |
[MySQL] ROLLBACK 완벽 가이드 사용법(변경사항 취소) (0) | 2025.06.17 |
[MySQL] BEGIN 완벽 가이드 사용법(트랜잭션 시작) (0) | 2025.06.17 |
[MySQL] START TRANSACTION 완벽 가이드 사용법(트랜잭션 제어 시작) (0) | 2025.06.17 |
[MySQL] SHOW CREATE USER 완벽 가이드 사용법(계정 생성 정보 확인) (0) | 2025.04.02 |
[MySQL] RESET PASSWORD 완벽 가이드 사용법(비밀번호 변경) (0) | 2025.04.02 |