11. 데이터베이스 트랜잭션(Transaction)과 ACID 특성
은행 송금 오류처럼 데이터가 불완전하게 처리되는 것을 막기 위해 모든 연산을 하나로 묶는 트랜잭션 개념과 이를 보장하는 ACID 특성을 다룹니다.
1. 트랜잭션(Transaction)의 정의
트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위를 이루는 연산들의 집합입니다.
쉽게 말해, 데이터베이스에서 "더 이상 쪼갤 수 없는 하나의 완벽한 거래 과정"을 뜻합니다. 여러 개의 SQL 명령어가 묶여서 마치 하나의 명령처럼 전부 실행되거나, 전부 실행되지 않아야 하는 단위를 의미합니다.
2. 트랜잭션이 필요한 이유
인터넷 쇼핑몰에서 결제하거나 은행에서 계좌 이체를 할 때, 네트워크 끊김이나 서버 다운 같은 예기치 못한 시스템 오류가 발생할 수 있습니다. 트랜잭션은 이러한 비정상적인 상황에서 데이터를 안전하게 보호합니다.
실제 개발에서 해결하는 문제
데이터 불완전 처리 방지: A 계좌에서 1만 원을 출금하여 B 계좌로 송금하는 도중 서버가 다운되었다고 가정해 봅시다. 출금은 되었는데 입금이 안 되면 1만 원이 공중으로 사라지는 대참사가 발생합니다. 트랜잭션은 송금 과정 전체를 하나로 묶어, 도중에 실패하면 출금 자체를 없었던 일로 되돌려 돈이 사라지는 문제를 막습니다.
3. 반드시 알아야 할 핵심 개념
트랜잭션 (Transaction): 하나의 세트로 처리되어야 하는 일련의 DB 조작 명령어 묶음입니다.
커밋 (Commit): 트랜잭션 내부의 모든 명령어들이 성공적으로 완료되어, 변경된 내용을 데이터베이스에 영구적으로 확정 저장하는 명령입니다.
롤백 (Rollback): 트랜잭션 처리 중 오류가 발생했을 때, 작업을 취소하고 트랜잭션 시작 전의 처음 상태로 안전하게 되돌리는 명령입니다.
4. 함께 알아야 하는 주변 기초 개념 (ACID 특성)
트랜잭션의 안전성을 완벽하게 보장하기 위해 데이터베이스가 반드시 만족해야 하는 4가지 성질인 ACID를 알아야 합니다.
원자성 (Atomicity): 트랜잭션 내의 연산은 전부 성공(All)하거나 전부 실패(Nothing)해야 합니다. 어정쩡하게 중간까지만 반영되는 것은 허용하지 않습니다.
일관성 (Consistency): 트랜잭션이 완료된 후의 데이터베이스는 언제나 미리 정해진 규칙과 제약조건을 완벽히 만족하는 올바른 상태여야 합니다. (예: 계좌 잔액은 0원 미만이 될 수 없다는 규칙 보장)
격리성 (Isolation): 둘 이상의 트랜잭션이 동시에 실행될 때, 서로의 작업에 끼어들거나 간섭할 수 없습니다. 각 트랜잭션은 마치 혼자서 DB를 쓰는 것처럼 독립적으로 실행되어야 합니다.
지속성 (Durability): 성공적으로 커밋(Commit) 완료된 트랜잭션의 결과는 시스템이 다운되거나 정전이 되더라도 영구적으로 디스크에 보존되어야 합니다.
5. 트랜잭션 처리의 실제 흐름
사용자가 은행 계좌 이체 서비스를 이용할 때 데이터베이스 내부에서 트랜잭션이 진행되는 물리적 단계입니다.
트랜잭션 시작 (START TRANSACTION): 지금부터 실행하는 모든 SQL문은 하나의 세트로 묶인다고 선언합니다.
출금 연산 실행: A 계좌의 잔액 테이블에서 1만 원을 차감하는
UPDATE문을 실행합니다.입금 연산 실행: B 계좌의 잔액 테이블에 1만 원을 더하는
UPDATE문을 실행합니다.성공 및 확정 (COMMIT): 두 연산이 에러 없이 모두 완료되면
COMMIT명령을 내려 데이터를 디스크에 영구 기록합니다.예외 발생 시 취소 (ROLLBACK): 만약 3번 단계(입금) 도중 오류가 발생하면 시스템은 즉시
ROLLBACK명령을 내려 2번 단계(출금)의 결과까지 통째로 취소하고 처음 상태로 되돌립니다.
6. 트랜잭션 제어 SQL 코드 예시
은행 계좌 이체 상황을 제어하는 표준 SQL 트랜잭션 코드 예시입니다.
START TRANSACTION;
-- 1. 보내는 사람 계좌에서 차감
UPDATE accounts SET balance = balance - 10000 WHERE account_no = 'A100';
-- 2. 받는 사람 계좌에 추가
UPDATE accounts SET balance = balance + 10000 WHERE account_no = 'B200';
-- 모든 연산이 정상인 경우에만 확정
COMMIT;
7. 예시 코드 상세 설명
START TRANSACTION;: 트랜잭션 창고를 열어 처리를 시작하겠다는 신호입니다. 이 아래에 오는 명령어들은 임시 저장 공간에서 대기하게 됩니다.
UPDATE accounts SET balance = balance - 10000...: A100 계좌의 잔액을 10,000원 깎습니다. 임시 상태이므로 아직 다른 사람은 이 변화를 볼 수 없습니다.
UPDATE accounts SET balance = balance + 10000...: B200 계좌의 잔액을 10,000원 채웁니다. 여전히 임시 대기 상태입니다.
COMMIT;: 대기 중이던 두 개의
UPDATE명령이 데이터베이스 실제 저장소에 한꺼번에 도장 찍히듯 확정 반영됩니다.
8. 초보자가 자주 실수하는 점 및 주의사항
트랜잭션을 너무 오랫동안 열어둘 때의 문제 (락 현상)
트랜잭션이 시작되어 UPDATE나 DELETE 같은 수정을 가하면, 데이터베이스는 다른 사람이 그 데이터를 마음대로 건드려 꼬이지 않도록 해당 행에 자물쇠를 채우는 락(Lock)을 겁니다. 이 자물쇠는 COMMIT이나 ROLLBACK을 해야만 풀립니다.
초보 개발자가 코딩 실수로 트랜잭션을 시작해 두고 종료(COMMIT/ROLLBACK) 명령을 누락하면, 해당 데이터에 영원히 자물쇠가 걸려 다른 일반 사용자들이 서비스 이용 시 무한 대기 상태에 빠지는 장애가 발생하므로 작업이 끝나면 반드시 트랜잭션을 닫아주어야 합니다.
9. 핵심 내용 요약
트랜잭션은 데이터베이스의 무결성을 지키는 안전장치로, 쪼갤 수 없는 하나의 작업 단위를 뜻합니다. 모든 작업이 성공하면 COMMIT으로 영구 반영하고, 에러가 나면 ROLLBACK으로 전체 취소하여 데이터의 원자성을 보장합니다. 이러한 완벽한 데이터 안전 처리를 위해 데이터베이스는 ACID(원자성, 일관성, 격리성, 지속성)라는 4가지 철저한 특성을 충족해야 합니다.
10. 핵심 용어 정리
트랜잭션 = 데이터베이스에서 분리될 수 없는 하나의 논리적인 작업 단위를 이루는 명령어 집합
COMMIT = 트랜잭션 안에서 수행된 모든 데이터 변경 사항을 데이터베이스에 영구적으로 반영하는 명령어
ROLLBACK = 트랜잭션 작업 중 오류가 발생했을 때 변경 사항을 모두 취소하고 이전 상태로 되돌리는 명령어
ACID = 데이터베이스 트랜잭션의 안전성을 보장하기 위한 4가지 필수 성질(원자성, 일관성, 격리성, 지속성)
락(Lock) = 동시성 제어를 위해 특정 트랜잭션이 사용 중인 데이터에 다른 사용자가 접근하지 못하도록 잠그는 장치
AD
제휴 광고
일부 링크는 제휴 링크이며, 구매 또는 가입 시 일정 수수료를 받을 수 있습니다.
AD