PostgreSQL에서는 진짜 중첩 트랜잭션이 표준 의미로는 없어. 오직 외부 트랜잭션이 있고, 그 안에 savepoint(저장점)이라는 "레이어"만 있을 뿐이야.
"중첩 트랜잭션"이라는 용어는 PostgreSQL에서 보통 savepoint를 SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT 같은 명령어로 쓰는 걸 의미해. 이건 각각 독립적인 트랜잭션이 아니라, 외부 트랜잭션 안에서 특정 시점으로 돌아갈 수 있게 해주는 체크포인트 같은 거야. 전체 트랜잭션을 다 롤백하지 않고도 일부만 되돌릴 수 있어.
실생활 비유로 보면: 너가 에디터에서 긴 글을 쓰고 있는데, 중간중간 ctrl+s로 저장한다고 생각해봐. 만약 실수했다면, 이전에 저장한 버전으로 돌아갈 수 있지만, 전체 작업을 다 날릴 필요는 없지.
savepoint 관리 명령어
중첩 트랜잭션을 다루기 위해 PostgreSQL은 세 가지 주요 명령어를 제공해:
SAVEPOINT
이 명령어는 "저장점"을 만들어서 필요할 때 그 시점으로 돌아갈 수 있게 해줘. 이 저장점은 트랜잭션에서 체크포인트 역할을 해.
SAVEPOINT mypoint;
ROLLBACK TO SAVEPOINT
지정한 저장점 이후에 한 일부 변경만 롤백하고, 그 전의 변경은 그대로 남겨둬. 같은 외부 트랜잭션 안에서만 가능해.
ROLLBACK TO SAVEPOINT mypoint;
RELEASE SAVEPOINT
저장점을 삭제하는 명령어야. 삭제하면 더 이상 그 저장점으로 돌아갈 수 없어.
RELEASE SAVEPOINT mypoint;
예시: 여러 테이블에 데이터 추가하고 롤백 가능하게 만들기
예를 들어, 주문 관리 시스템을 만든다고 해보자. 여기서 orders랑 order_items 두 테이블에 동시에 데이터를 저장해야 해. 한 테이블에 추가하다가 에러가 나도, 다른 테이블의 데이터는 롤백되지 않아야 해.
BEGIN; -- 트랜잭션 시작
-- 저장점 만들기
SAVEPOINT before_order;
-- 주문을 orders 테이블에 추가
INSERT INTO orders (order_id, customer_id, date)
VALUES (1, 101, CURRENT_DATE);
-- 여기서 에러가 나면 롤백
SAVEPOINT before_order_items;
-- 상품을 order_items 테이블에 추가
INSERT INTO order_items (order_id, product_id, quantity)
VALUES (1, 2001, 4);
-- 뭔가 잘못됐을 때
-- ROLLBACK TO SAVEPOINT before_order_items;
-- 트랜잭션 확정(변경사항 저장)
COMMIT;
만약 order_items에 레코드 추가할 때 에러가 나면, before_order_items 저장점으로 롤백할 수 있어. 그러면 orders 테이블에 들어간 데이터는 그대로 남아.
실전 팁과 흔한 실수
이제 SAVEPOINT랑 ROLLBACK TO SAVEPOINT가 어떻게 동작하는지 알았으니까, 문제를 피하려면 아래 팁들을 참고해봐:
- 저장점 이름 짓기.
SAVEPOINT에는 알아보기 쉽고 유니크한 이름을 써. 예를 들어before_insert,step1이런 식으로 하면 디버깅할 때 헷갈리지 않아. SAVEPOINT해제 잊지 말기. 더 이상 돌아갈 필요 없는 저장점은RELEASE SAVEPOINT로 삭제해서 트랜잭션을 깔끔하게 관리해.- 중첩 트랜잭션 ≠ 별도 트랜잭션.
COMMIT을 실행하면 모든 저장점이 사라져. 외부COMMIT이 끝나면 더 이상 롤백 못 해. 이 점 꼭 기억해. - 데이터 락(lock). 저장점으로 롤백해도 트랜잭션 안에서 걸린 레코드 락은 그대로야. 여러 명이 동시에 작업하는 환경에서는 이걸 꼭 신경 써야 해.
SAVEPOINT랑 ROLLBACK TO SAVEPOINT를 활용한 중첩 트랜잭션은 개발자한테 복잡한 상황을 처리할 수 있는 강력한 무기야. 이제 트랜잭션을 유연하게 쪼개서 에러도 부드럽게 처리하고, 불필요한 데이터 롤백도 피할 수 있어. "롤백"이라는 단어를 볼 때마다 너무 겁먹지 마! 가끔은 롤백이 앞으로 나아가는 최고의 방법일 때도 있으니까.
GO TO FULL VERSION