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

MySQL에서 SAVEPOINT로 중첩 트랜잭션 구현하는 방법

MySQL은 기본적으로 중첩 트랜잭션을 직접 지원하지 않지만, SAVEPOINT 문을 활용하면 사실상 중첩 트랜잭션과 같은 효과를 낼 수 있습니다. SAVEPOINT를 사용하면 트랜잭션 내에 이름이 지정된 저장 지점을 만들고, 필요할 때 해당 지점까지만 롤백하여 전체 트랜잭션을 취소하지 않고도 특정 작업만 되돌릴 수 있습니다.

중첩 트랜잭션 처리 순서

전체 작업 흐름은 다음과 같습니다.

  1. 테이블을 생성합니다.
  2. 트랜잭션을 시작합니다(START TRANSACTION).
  3. 테이블에 레코드를 삽입합니다.
  4. SAVEPOINT 문으로 식별자 이름을 가진 저장 지점을 설정합니다.
  5. 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 기반의 중첩 트랜잭션 패턴은 매우 유용하게 활용됩니다.