본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

트랜잭션은 무엇을 묶는가

~12 min · transactions, concepts

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

데이터베이스가 하나로 다루는 작업

트랜잭션은 SQL 문장 여러 개를 전부 성공하거나 전부 없던 일로 만드는 단위야. ACID의 4글자 약속이 실제 명령으로 드러나는 자리이기도 해. BEGIN으로 열고 COMMIT으로 확정하며, 실패하면 ROLLBACK으로 모든 변경을 버려.

autocommit과 명시적 경계

BEGIN을 쓰지 않으면 각 SQL 문장은 자체 트랜잭션으로 실행돼. 한 문장으로 끝나는 일에는 괜찮지만 여러 테이블의 변경이 함께 확정되어야 한다면 BEGIN ... COMMIT으로 묶어야 해.

중간까지만 되돌리는 저장점

SAVEPOINT를 두면 열린 트랜잭션 안의 특정 지점으로 돌아갈 수 있어. 앞서 성공한 작업은 남기고 일부 단계만 다시 해야 하는 긴 일괄 작업에 유용하지만, 경계를 복잡하게 숨기는 수단으로 남용하지 마.

Code

기본 모양·sql
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
COMMIT;
-- 두 update 같이 land, 또는 둘 다 안 됨.
롤백·sql
BEGIN;
DELETE FROM users WHERE last_login < now() - INTERVAL '5 years';
-- ... 결과 봄; 뭔가 이상해 ...
ROLLBACK;
-- DB 변경 없음. DELETE 일어난 적 없음.
저장점·sql
BEGIN;
INSERT INTO orders (...) VALUES (...);
SAVEPOINT after_order;
INSERT INTO order_items (...) VALUES (...);
-- 실패하면 item 만 undo, order 유지
ROLLBACK TO SAVEPOINT after_order;
-- 다른 접근 시도
INSERT INTO order_items (...) VALUES (...);
COMMIT;

External links

Exercise

psql에서 여러 단계의 UPDATE를 BEGIN과 COMMIT으로 묶어 실행해. 같은 작업을 ROLLBACK으로 끝내는 경우도 실행하고 두 경우의 최종 상태가 예상과 같은지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.