MySQL에서 CREATE DATABASE, DROP DATABASE 같은 데이터베이스 관련 명령문, CREATE TABLE, ALTER TABLE, DROP TABLE 같은 테이블 관련 명령문, 그리고 저장 프로시저(스토어드 루틴) 생성 등의 DDL(Data Definition Language) 문장이 현재 진행 중인 트랜잭션 중간에 실행되면, 해당 트랜잭션은 자동으로 커밋(commit)된 후 종료됩니다.
즉, 트랜잭션 내에서 수행된 모든 데이터베이스 변경 사항은 영구적으로 반영되며, 이후에는 ROLLBACK으로 되돌릴 수 없습니다. 이는 DDL 문장이 실행되는 순간 MySQL이 내부적으로 암묵적인 커밋(implicit commit)을 수행하기 때문입니다.
예제
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO MARKS Values(6,'Manak','History',70); 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은 그동안 수행한 모든 변경 사항을 저장하고 더 이상 롤백할 수 없게 됩니다. 아래 결과 집합을 통해 이를 직접 확인할 수 있습니다.
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 | | 4 | Rahul | History | 40 | | 5 | Yashraj | English | 48 | | 6 | Manak | History | 70 | +------+---------+-----------+-------+ 6 rows in set (0.00 sec)
ROLLBACK을 실행했음에도 불구하고, 트랜잭션 안에서 INSERT로 추가한 Manak의 데이터(Id 6)가 여전히 테이블에 남아 있는 것을 확인할 수 있습니다. 이는 DDL 문장이 실행된 시점에 트랜잭션이 이미 커밋되어 종료되었기 때문입니다.
따라서 트랜잭션을 사용하는 애플리케이션을 개발할 때는 DML(SELECT, INSERT, UPDATE, DELETE) 작업과 DDL 작업을 하나의 트랜잭션 안에서 섞어 사용하지 않도록 주의해야 합니다. 의도치 않은 커밋으로 인해 데이터 정합성이 깨질 수 있기 때문입니다.