MySQL에서는 사용자가 명시적으로 COMMIT이나 ROLLBACK을 실행하지 않아도 특정 작업 수행 시 현재 트랜잭션이 자동으로, 즉 암시적으로 종료됩니다. 대표적인 경우는 다음과 같습니다.
1. DDL 문 실행 시
CREATE DATABASE, DROP DATABASE, CREATE TABLE, ALTER TABLE, DROP TABLE, 저장 프로시저나 함수 같은 저장 루틴(stored routine) 생성 등 DDL(Data Definition Language) 문을 실행하면 현재 트랜잭션이 암시적으로 종료되고, 그동안 쌓인 변경 사항은 자동으로 커밋됩니다. 그 이유는 MySQL에서 DDL 문은 롤백(ROLLBACK)이 불가능하기 때문입니다.
예제
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO MARKS Values(3,'gaurav','Comp',69); Query OK, 1 row affected (0.26 sec) mysql> CREATE TABLE student(id INT, Name VARCHAR(10)); Query OK, 0 rows affected (0.84 sec)
트랜잭션 도중에 DDL 문(CREATE TABLE)을 실행했기 때문에 해당 트랜잭션은 암시적으로 종료됩니다. MySQL은 지금까지의 모든 변경 사항을 저장하며, 이후 ROLLBACK을 실행해도 되돌릴 수 없습니다. 아래 결과를 통해 확인할 수 있습니다.
mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM marks; +------+---------+-----------+-------+ | Id | Name | Subject | Marks | +------+---------+-----------+-------+ | 1 | Aarav | Maths | 50 | | 1 | Harshit | Maths | 55 | | 3 | Gaurav | Comp | 69 | +------+---------+-----------+-------+ 3 rows in set (0.00 sec)
ROLLBACK을 실행했음에도 Gaurav 데이터가 그대로 남아 있는 것을 볼 수 있습니다. 이는 DDL 문 실행 시점에 이미 커밋되었기 때문입니다.
2. 클라이언트 세션 연결 해제 시
클라이언트 세션의 연결을 끊으면 현재 세션이 암시적으로 종료됩니다. 이 경우에는 DDL 실행 때와 달리, 커밋되지 않은 변경 사항이 모두 롤백됩니다.
3. 클라이언트 세션 강제 종료(KILL) 시
KILL 명령 등으로 클라이언트 세션을 강제로 종료해도 현재 세션이 암시적으로 종료됩니다. 이 경우에도 커밋되지 않은 변경 사항은 롤백됩니다.
4. START TRANSACTION 명령 실행 시
진행 중인 트랜잭션이 있을 때 새로운 START TRANSACTION 명령을 실행하면 기존 트랜잭션이 암시적으로 종료되며, 이때까지의 변경 사항은 커밋됩니다.
예제
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO Marks Values(4, 'Rahul','History',40); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO Marks Values(5, 'Yashraj','English',48); Query OK, 1 row affected (0.00 sec) mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec)
위 예제에서 두 번째 START TRANSACTION 문이 실행되는 순간 첫 번째 트랜잭션은 암시적으로 종료되고, 삽입된 두 건의 데이터가 커밋됩니다. 아래 조회 결과로 확인할 수 있습니다.
mysql> SELECT * FROM marks; +------+---------+-----------+-------+ | Id | Name | Subject | Marks | +------+---------+-----------+-------+ | 1 | Aarav | Maths | 50 | | 1 | Harshit | Maths | 55 | | 3 | Gaurav | Comp | 69 | | 4 | Rahul | History | 40 | | 5 | Yashraj | English | 48 | +------+---------+-----------+-------+ 5 rows in set (0.00 sec)
정리
| 상황 | 변경 사항 처리 |
|---|---|
| DDL 문 실행(CREATE, ALTER, DROP 등) | 커밋됨 (롤백 불가) |
| 클라이언트 세션 연결 해제 | 롤백됨 |
| 클라이언트 세션 강제 종료(KILL) | 롤백됨 |
| 새로운 START TRANSACTION 실행 | 커밋됨 |
이처럼 트랜잭션이 의도치 않게 커밋되거나 롤백될 수 있으므로, 중요한 데이터를 다룰 때는 위와 같은 암시적 종료 상황을 항상 염두에 두고 작업하는 것이 안전합니다.