MySQL은 기본적으로 중첩 트랜잭션을 직접 지원하지 않지만, SAVEPOINT 문을 활용하면 사실상 중첩 트랜잭션과 같은 효과를 낼 수 있습니다. SAVEPOINT를 사용하면 트랜잭션 내에 이름이 지정된 저장 지점을 만들고, 필요할 때 해당 지점까지만 롤백하여 전체 트랜잭션을 취소하지 않고도 특정 작업만 되돌릴 수 있습니다.
중첩 트랜잭션 처리 순서
전체 작업 흐름은 다음과 같습니다.
- 테이블을 생성합니다.
- 트랜잭션을 시작합니다(START TRANSACTION).
- 테이블에 레코드를 삽입합니다.
- SAVEPOINT 문으로 식별자 이름을 가진 저장 지점을 설정합니다.
- ROLLBACK TO SAVEPOINT로 특정 저장 지점까지 되돌립니다.
1단계: 테이블 생성
mysql> create table NestedTransactionDemo -> ( -> Name varchar(200) -> ); Query OK, 0 rows affected (0.63 sec)
2단계: 트랜잭션 시작
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec)
3단계: 레코드 삽입 및 확인
먼저 첫 번째 레코드를 삽입합니다.
mysql> insert into NestedTransactionDemo values('John');
Query OK, 1 row affected (0.04 sec)삽입된 레코드를 조회해 확인합니다.
mysql> select *from NestedTransactionDemo; +------+ | Name | +------+ | John | +------+ 1 row in set (0.00 sec)
4단계: SAVEPOINT로 중첩 트랜잭션 만들기
이제 transaction2라는 이름의 세이브포인트를 생성하고, 그 이후에 새 레코드를 추가합니다.
mysql> savepoint transaction2;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into NestedTransactionDemo values('David');
Query OK, 1 row affected (0.00 sec)
mysql> select *from NestedTransactionDemo;
+-------+
| Name |
+-------+
| John |
| David |
+-------+
2 rows in set (0.00 sec)5단계: ROLLBACK TO로 저장 지점까지 되돌리기
ROLLBACK TO transaction2를 실행하면 세이브포인트 이후의 변경 사항(David 레코드)만 취소되고, 이전 데이터는 그대로 유지됩니다.
mysql> rollback to transaction2; Query OK, 0 rows affected (0.00 sec) mysql> select *from NestedTransactionDemo; +------+ | Name | +------+ | John | +------+ 1 row in set (0.00 sec)
정리
이처럼 MySQL에서는 SAVEPOINT와 ROLLBACK TO SAVEPOINT를 조합하면 중첩 트랜잭션처럼 동작하는 논리적 구간을 만들 수 있습니다. 다만 주의할 점도 있습니다.
- 세이브포인트 해제: 더 이상 필요 없는 세이브포인트는
RELEASE SAVEPOINT로 명시적으로 제거하는 것이 좋습니다. - 전체 롤백:
ROLLBACK(저장 지점 없이)을 실행하면 모든 세이브포인트가 삭제되고 트랜잭션 전체가 취소됩니다. - 커밋 시 자동 삭제: COMMIT을 실행하면 설정된 모든 세이브포인트가 함께 사라집니다.
복잡한 비즈니스 로직에서 부분적인 성공·실패 처리가 필요할 때 SAVEPOINT 기반의 중첩 트랜잭션 패턴은 매우 유용하게 활용됩니다.