Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 트랜잭션이 암시적으로 종료되는 4가지 경우

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 실행커밋됨

이처럼 트랜잭션이 의도치 않게 커밋되거나 롤백될 수 있으므로, 중요한 데이터를 다룰 때는 위와 같은 암시적 종료 상황을 항상 염두에 두고 작업하는 것이 안전합니다.