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; -- (필요 시 실행)

Reference

etymonline - transaction 의 어원