CodeGym /행동 /SQL SELF /중첩 트랜잭션: SAVEPOINT, ROLLBACK TO SAVEPOINT

중첩 트랜잭션: SAVEPOINT, ROLLBACK TO SAVEPOINT

SQL SELF
레벨 53 , 레슨 0
사용 가능

PostgreSQL에서는 진짜 중첩 트랜잭션이 표준 의미로는 없어. 오직 외부 트랜잭션이 있고, 그 안에 savepoint(저장점)이라는 "레이어"만 있을 뿐이야.

"중첩 트랜잭션"이라는 용어는 PostgreSQL에서 보통 savepointSAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT 같은 명령어로 쓰는 걸 의미해. 이건 각각 독립적인 트랜잭션이 아니라, 외부 트랜잭션 안에서 특정 시점으로 돌아갈 수 있게 해주는 체크포인트 같은 거야. 전체 트랜잭션을 다 롤백하지 않고도 일부만 되돌릴 수 있어.

실생활 비유로 보면: 너가 에디터에서 긴 글을 쓰고 있는데, 중간중간 ctrl+s로 저장한다고 생각해봐. 만약 실수했다면, 이전에 저장한 버전으로 돌아갈 수 있지만, 전체 작업을 다 날릴 필요는 없지.

savepoint 관리 명령어

중첩 트랜잭션을 다루기 위해 PostgreSQL은 세 가지 주요 명령어를 제공해:

SAVEPOINT

이 명령어는 "저장점"을 만들어서 필요할 때 그 시점으로 돌아갈 수 있게 해줘. 이 저장점은 트랜잭션에서 체크포인트 역할을 해.

SAVEPOINT mypoint;

ROLLBACK TO SAVEPOINT

지정한 저장점 이후에 한 일부 변경만 롤백하고, 그 전의 변경은 그대로 남겨둬. 같은 외부 트랜잭션 안에서만 가능해.

ROLLBACK TO SAVEPOINT mypoint;

RELEASE SAVEPOINT

저장점을 삭제하는 명령어야. 삭제하면 더 이상 그 저장점으로 돌아갈 수 없어.

RELEASE SAVEPOINT mypoint;

예시: 여러 테이블에 데이터 추가하고 롤백 가능하게 만들기

예를 들어, 주문 관리 시스템을 만든다고 해보자. 여기서 ordersorder_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 테이블에 들어간 데이터는 그대로 남아.

실전 팁과 흔한 실수

이제 SAVEPOINTROLLBACK TO SAVEPOINT가 어떻게 동작하는지 알았으니까, 문제를 피하려면 아래 팁들을 참고해봐:

  1. 저장점 이름 짓기. SAVEPOINT에는 알아보기 쉽고 유니크한 이름을 써. 예를 들어 before_insert, step1 이런 식으로 하면 디버깅할 때 헷갈리지 않아.
  2. SAVEPOINT 해제 잊지 말기. 더 이상 돌아갈 필요 없는 저장점은 RELEASE SAVEPOINT로 삭제해서 트랜잭션을 깔끔하게 관리해.
  3. 중첩 트랜잭션 ≠ 별도 트랜잭션. COMMIT을 실행하면 모든 저장점이 사라져. 외부 COMMIT이 끝나면 더 이상 롤백 못 해. 이 점 꼭 기억해.
  4. 데이터 락(lock). 저장점으로 롤백해도 트랜잭션 안에서 걸린 레코드 락은 그대로야. 여러 명이 동시에 작업하는 환경에서는 이걸 꼭 신경 써야 해.

SAVEPOINTROLLBACK TO SAVEPOINT를 활용한 중첩 트랜잭션은 개발자한테 복잡한 상황을 처리할 수 있는 강력한 무기야. 이제 트랜잭션을 유연하게 쪼개서 에러도 부드럽게 처리하고, 불필요한 데이터 롤백도 피할 수 있어. "롤백"이라는 단어를 볼 때마다 너무 겁먹지 마! 가끔은 롤백이 앞으로 나아가는 최고의 방법일 때도 있으니까.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION