Intro
트랜잭션이라는 용어에 대해서 “대충 이러이러한 의미겠지~” 감만 잡고 있었다. 하지만 이 미적지근한 기분을 떨칠 수가 없었다. 이번 포스팅을 통해 트랜잭션이 무슨 의미인지에 대해 정확히 이해하고 넘어가보도록 하자.
트랜잭션
트랜잭션의 개념
트랜잭션(transaction)은 데이터베이스 시스템에서 하나의 논리적 작업 단위
를 의미한다. 보통의 책들이나 인터넷에서는 이렇게 설명하고 있다. 더 쉽게 말하자면 데이터베이스에서 한 번에 수행되는 여러 작업들의 묶음
이라고 할 수 있다.
데이터베이스 시스템에 들어오는 요청에 따라 필요한 데이터와 관련된 조회, 입력, 수정, 삭제 작업 등을 트랜잭션
이라는 단위로 묶어 처리하고, 이 트랜잭션에 포함된 모든 작업이 성공적으로 끝나야만
데이터베이스에 결과가 영구적으로 반영되는 특징을 가지고 있다. 오류가 생긴다면 트랜잭션 이전 상태로
되돌아간다.
즉, 트랜잭션은 "모두 완료되거나, 아무것도 하지 않는다"
는 원칙을 따르는 작업 단위라고 할 수 있다.
트랜잭션의 어원
transaction은 ‘분쟁의 조정, 협상된 합의, 사건의 관리나 해결’을 의미하는 단어로, 프랑스어로 ‘교환, 거래’를 뜻하는 ‘transaccion’에서 유래되었고, 라틴어에서 ‘합의, 완성’이라는 의미를 가진 ‘transactionem’ 라는 동사 행위 명사에서 유래되었다.
더 쉽게 접근해서, 상업 분야에서 사용되었던 트랜잭션이라는 단어는 거래나 업무처리를 의미했는데, 거래나 업무처리에 포함된 모든 작업과 절차가 성공적으로 완료되어야만 유효한 거래로 인정되었다.
트랜잭션이라는 단어는 데이터베이스 분야에서 쓰이기 시작했는데, ‘다양한 작업(=절차)이 모두 완료되어야 하나의 완전한 작업 묶음(=거래)로 처리되는 것’ 이라는 원래의 뜻과 상통하는 의미로 사용되고 있다.
트랜잭션의 실행 과정
과정 | 설명 |
---|---|
BEGIN | 트랜잭션의 시작 |
COMMIT | 모든 작업이 성공적으로 수행되었음을 알리고, 데이터베이스에 영구적으로 반영한다. |
ROLLBACK | 작업 중 오류가 발생했거나 취소된 경우, 작업들의 집합(트랜잭션) 이전 상태로 되돌린다. |
트랜잭션의 특징
특징 | 설명 |
---|---|
원자성 atomicity |
- 트랜잭션은 “모두 실행되거나, 아무것도 실행되지 않는” 것을 보장한다. - 중간 상태 없이 전부 완료하거나, 처음과 같은 상태로 복구되어 유지되도록 한다. |
일관성 consistency |
- 트랜잭션이 완료된 후에도 데이터베이스는 항상 일관된 상태를 유지해야 한다. - 규칙이나 제약 조건을 항상 만족해야 한다. |
고립성 isolation |
- 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 서로 간섭하지 않고 독립적으로 실행된다. - 다른 트랜잭션이 완료되기 전까지 중간 상태를 볼 수 없다. |
지속성 durability |
- 트랜잭션이 성공적으로 완료되면 그 결과는 데이터베이스에 영구적으로 반영된다. |
트랜잭션의 필요성
(1) 데이터의 일관성 유지
동시 요청 상황에서도 각 요청에 따른 데이터 처리 작업 묶음을 하나의 트랜잭션으로 하고, 이 트랜잭션 단위로 데이터를 처리하여, 데이터가 왜곡되지 않도록 보장한다.
(2) 복구 가능
작업 중 발생한 오류나 시스템 충돌, 사용자의 작업 취소 요청에 따라 해당 작업들(트랜잭션)의 이전 상태로 복구하여 데이터 무결성을 복원할 수 있다.
(3) 보안 강화
트랜잭션이 완료되기 전까지 작업 결과를 볼 수 없게 함으로써 보안 문제를 최소화한다.
트랜잭션의 예시
개념적 예시
-한 계좌에서 돈을 출금하고, 다른 계좌로 입금하는 요청에 따른 트랜잭션
1
2
1. 계좌 A에서 100만원을 출금(감소)한다.
2. 계좌 B에 100만원을 입금(증가)한다.
특징 | 예시 |
---|---|
원자성 | 두 작업이 모두 완료되어야 하며, 하나라도 실패하면 출금 전 상태로 복구한다. |
일관성 | 계좌 이체이므로 총 계좌의 잔액은 변하지 않아야 한다. |
고립성 | 다른 작업이나 사용자가 이 작업 중 계좌 A나 B의 중간 잔액을 볼 수 없다. |
지속성 | 작업이 성공하면 계좌 데이터베이스에 결과가 반영되어 유지된다. |
SQL 구문으로 보는 예시
-동일하게 한 계좌에서 돈을 출금하고, 다른 계좌로 입금하는 요청에 따른 트랜잭션
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 트랜잭션 시작
BEGIN TRANSACTION;
-- 계좌 A 에서 100만원 출금
UPDATE accounts
SET balance = balance - 1000000
WHERE account_id = 'A';
-- 계좌 B 에 100만원을 입금
UPDATE accounts
SET balance = balance + 1000000
WHERE account_id = 'B';
-- 작업을 저장하고 완료
COMMIT;
-- 문제가 발생하면 작업을 취소
-- ROLLBACK; -- (필요 시 실행)