이전 강의에서 트랜잭션이 뭔지 잠깐 얘기했었지. 다시 말하면, 트랜잭션은 여러 작업을 하나로 묶어서 전부 다 성공하거나, 아니면 아무것도 안 한 것처럼 만드는 거야. 예를 들어 은행 송금할 때, 한 계좌에서 돈을 빼고 다른 계좌에 넣어야 하잖아. 만약 둘 중 하나라도 실패하면(예를 들어 돈은 빠졌는데 입금이 안 됐다면), 진짜 골치 아픈 상황이 생겨. 이럴 때 트랜잭션이 딱 필요하지.
트랜잭션은 완전히 실행되거나, 아예 실행 안 돼. 이걸 "올 오어 낫싱" 원칙이라고 불러.
BEGIN;
-- 한 계좌에서 잔액 줄이기
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 다른 계좌에 잔액 늘리기
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- 변경사항 적용
뭔가 잘못되면 ROLLBACK으로 변경사항을 되돌릴 수 있어.
ACID 트랜잭션 속성이란?
PostgreSQL(그리고 대부분의 관계형 데이터베이스)에서 트랜잭션 얘기할 때 자주 나오는 게 ACID야. 이건 화학 얘기가 아니고, Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)의 약자야. 이 네 가지 속성이 데이터가 안전하게, 순서대로, 그리고 예측 가능하게 처리되도록 보장해줘.
원자성 (Atomicity)
트랜잭션은 전부 다 성공하거나, 아니면 전부 다 취소돼. 중간에 뭔가 꼬이면 다 롤백되는 거지. 예를 들어 송금하다가 에러 나면, 전부 취소되거나, 아니면 완전히 처리돼. "반쯤" 처리되는 일은 없어.
일관성 (Consistency)
트랜잭션이 끝나면 데이터베이스는 항상 올바른 상태로 남아야 해. 모든 규칙, 제약조건, 테이블 간의 관계가 지켜져야 하지. 예를 들어 잔액이 마이너스가 안 되게 막아놨으면, 그걸 어기는 트랜잭션은 저장 자체가 안 돼.
격리성 (Isolation)
한 트랜잭션이 끝나기 전까지, 다른 트랜잭션은 그 중간 데이터를 볼 수 없어야 해. 이게 안 되면, 데이터가 "이상한" 상태로 보일 수 있거든. 예를 들어 쇼핑몰에서 돈은 빠졌는데, 주문에는 상품이 안 들어간 상태를 본다면 진짜 당황스럽겠지?
지속성 (Durability)
트랜잭션이 성공적으로 끝나면, 그 변경사항은 무조건 저장돼. 심지어 갑자기 정전이 돼도 데이터는 남아있어. 마치 "저장" 버튼 누르고 진짜 저장됐다는 확신이 드는 거랑 똑같아.
이 네 가지 속성이 바로 트랜잭션이 데이터베이스에서 신뢰받는 이유야.
트랜잭션이 필요한 실제 상황 예시
이론도 중요하지만, 트랜잭션의 진짜 힘은 실제 문제에서 드러나. 돈이 오가는 상황, 여러 테이블이 연결된 작업, 대량 변경 같은 데서 트랜잭션이 없으면 데이터가 엉망이 될 수 있어. 트랜잭션 덕분에 데이터가 안전하게, 확실하게 처리되는 거지.
여기 트랜잭션이 진짜 빛을 발하는 대표적인 예시 몇 가지를 볼게:
1. 결제 처리
고객이 한 계좌에서 다른 계좌로 돈을 보낼 때, 트랜잭션 덕분에 돈이 사라지거나 중간에 멈추는 일이 없어:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
만약 첫 번째 계좌에 돈이 부족하면, 변경사항을 되돌릴 수 있어:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- 어, 잔액이 마이너스네!
ROLLBACK;
2. 연결된 테이블 업데이트
예를 들어 학생 상태를 "졸업"으로 바꾸면서 동시에 "졸업생" 테이블에 기록을 추가한다고 해보자:
BEGIN;
UPDATE students SET status = 'graduated' WHERE student_id = 42;
INSERT INTO graduates (student_id, graduation_date) VALUES (42, '2023-06-10');
COMMIT;
만약 INSERT에서 에러가 나면, 데이터베이스는 원래 상태로 돌아가.
3. 대량 데이터 업데이트
트랜잭션은 대규모 업데이트 작업에도 유용해. 예를 들면:
BEGIN;
UPDATE orders SET status = 'completed' WHERE delivery_date < CURRENT_DATE;
COMMIT;
만약 서버가 다운되거나, 업데이트가 잘못됐다는 걸 알게 되면 언제든지 변경사항을 되돌릴 수 있어!
트랜잭션 다루는 명령어
PostgreSQL에서는 몇 가지 핵심 명령어가 있어:
BEGIN: 새 트랜잭션을 시작해:BEGIN;COMMIT: 트랜잭션에서 한 모든 변경사항을 저장해:COMMIT;
ROLLBACK: 현재 트랜잭션에서 한 모든 변경사항을 취소해:
ROLLBACK;
전체 트랜잭션 사이클 예시
BEGIN;
-- 몇 가지 작업
UPDATE accounts SET balance = balance - 200 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;
-- 변경사항을 되돌리기로 결정
ROLLBACK;
-- 다시 시작
BEGIN;
-- 같은 작업이지만 다른 금액으로 송금
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 트랜잭션 마무리
COMMIT;
교과서 밖의 트랜잭션
온라인 쇼핑몰. 많은 플랫폼이 트랜잭션으로 주문과 결제를 관리해. 예를 들어 결제가 성공해야만 주문이 완료돼. 뭔가 잘못되면 주문이 자동으로 취소돼.
은행 시스템. 트랜잭션 덕분에 갑자기 정전이 나도 네 돈이 안전하게 지켜져.
트랜잭션 기록. PostgreSQL은 WAL(Write-Ahead Logging) 로그를 저장해서 장애가 나도 데이터를 복구할 수 있어. 이게 바로 트랜잭션을 믿을 수 있게 해주는 마법이야.
다음 강의에서는 BEGIN, COMMIT, ROLLBACK 명령어를 더 자세히 파보고, 대량 작업이나 SAVEPOINT로 부분 롤백하는 예시도 볼 거야. 다음에 또 보자!
GO TO FULL VERSION