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

DB 가 한 단위로 다루는 작업 단위

트랜잭션은 DB 가 단일 all-or-nothing 단위로 다루는 statement 시퀀스. 모든 statement 가 commit 되거나, 아무것도 안 됨. 이게 ACID 의 4-글자 약속, 구체화: BEGIN 이 트랜잭션 열고, COMMIT 이 효과 영구화, ROLLBACK 이 일어난 적 없는 것처럼 다 버림.

Autocommit default

BEGIN 없으면 모든 statement 가 자체 묵시적 트랜잭션 (autocommit). 단일 statement 작업엔 OK. 한 statement 이상 거쳐 한 행 이상 건드리고 변경이 같이 land 해야 하면 BEGIN ... COMMIT 으로 감싸야.

Savepoint — 트랜잭션 안 트랜잭션

Savepoint 가 열린 트랜잭션 안의 마커, 거기로 롤백 가능 (이전 작업 안 잃고). 한 실패가 지금까지 성공한 거 다 undo 하면 안 되는 긴 batch job 에 유용.

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 일어난 적 없음.
Savepoint·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 에서 BEGIN/COMMIT 안에 multi-step UPDATE. ROLLBACK 으로 같은 거 반복. 각 케이스에 최종 상태가 예상한 거 확인.

Progress

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

댓글 0

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

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