DBMS - 트랜잭션: 기본 개념과 그 이상 이해하기

안녕하세요, 미래의 데이터베이스 마법사 여러분! 데이터베이스 트랜잭션의 fascineting 세계로 여러분을 안내하게 되어 기쁩니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 주제로 고생하는 학생들을 많이 보았지만, 이 튜토리얼의 끝까지 따라오시면 트랜잭션 전문가가 될 것을 약속해드립니다! 시작해보겠습니다!

DBMS - Transaction

트랜잭션是什么?

복잡한 것에 들어가기 전에 기본적인 것으로 시작해보겠습니다. ATM에서 돈을 인출하는 상황을 상상해보세요. 카드를 삽입하고, PIN을 입력하고, 인출 금액을 선택하고, 현금을 받습니다. 이 전체 과정은 트랜잭션입니다. 데이터베이스 용어로, 트랜잭션은 단일 논리적인 작업 단위로 수행되는 연속적인 연산의序列입니다.

트랜잭션의 간단한 예시를 pseudo code로 보여드리겠습니다:

BEGIN TRANSACTION
account WHERE id = 12345의 balance를 읽는다.
IF balance >= 100 THEN
account WHERE id = 12345의 balance를 100을 뺀다.
100 달러를 지급한다.
ELSE
"금액 부족"을 표시한다.
END IF
COMMIT TRANSACTION

이 트랜잭션은 모든 단계가 성공적으로 완료되거나 (돈이 인출되고 잔액이 업데이트된다) 아님에도 불구하고 모두 완료되지 않는다(잔액이 부족하면 아무 변화가 없다).

ACID 속성

이제 트랜잭션의 네 가지 기둥, 즉 ACID 속성에 대해 이야기해보겠습니다. 이는 데이터베이스 시스템에서 데이터의 일관성과 효율성을 유지하는 데 필수적입니다.

원자성(Atomicity)

원자성은 트랜잭션이 단일, 분할할 수 없는 단위로 처리된다는 것을 보장합니다. 전부 또는 전혀 아님 - 트랜잭션 내의 모든 연산이 성공적으로 완료되거나 아님에도 불구하고 모두 완료되지 않습니다.

예시:

BEGIN TRANSACTION;
accounts WHERE id = 'Alice'의 balance를 100을 뺀다.
accounts WHERE id = 'Bob'의 balance를 100을 더한다.
COMMIT;

이 트랜잭션의 일부가 실패하면 (예: Bob의 계정이 존재하지 않는다면), 전체 트랜잭션이 롤백되고 Alice의 잔액은 변경되지 않습니다.

일관성(Consistency)

일관성은 트랜잭션이 데이터베이스를 하나의 유효한 상태에서 다른 유효한 상태로 이동시킨다는 것을 보장합니다. 데이터베이스의 일관성 제약을 유지합니다.

예시: 모든 계정 잔액이 양수이어야 한다는 규칙을 가정해봅시다.

BEGIN TRANSACTION;
accounts WHERE id = 'Alice'의 balance를 200을 뺀다.
-- Alice의 잔액이 음수가 되면 트랜잭션이 취소됩니다.
COMMIT;

이격성(Isolation)

이격성은 동시 실행된 트랜잭션이 연속적으로 실행된 것과 동일한 데이터베이스 상태를 남긴다는 것을 보장합니다.

예시: 두 개의 트랜잭션이 동시에 실행되는 상황을 상상해보세요:

-- 트랜잭션 1
BEGIN TRANSACTION;
accounts WHERE id = 'Alice'의 balance를 100을 뺀다.
-- 일부 지연이 발생합니다.
accounts WHERE id = 'Bob'의 balance를 100을 더한다.
COMMIT;

-- 트랜잭션 2
BEGIN TRANSACTION;
accounts WHERE id = 'Alice'의 balance를 선택한다.
COMMIT;

이격성은 트랜잭션 2가 Alice의 잔액을 이전 이체 전이나 이체 후 상태로 보지만, 절반 상태로는 절대 보지 않는다는 것을 보장합니다.

지속성(Durability)

지속성은 트랜잭션이 커밋된 후, 전원 고장, 충돌 또는 오류가 발생하더라도 그대로 유지된다는 것을 보장합니다.

예시: 다음 트랜잭션을 실행한 후:

BEGIN TRANSACTION;
audit_log 테이블에 ('User login', CURRENT_TIMESTAMP)를 추가한다.
COMMIT;

추가된 기록은 시스템이 즉시 충돌한 후에도 유지됩니다.

시리얼라이즈 가능성(Serializability)

시리얼라이즈 가능성은 트랜잭션 간의 이격성의 가장 높은 수준입니다. 이는 동시 실행된 트랜잭션이 어떤 순서로 연속적으로 실행된 것과 동일한 데이터베이스 상태를 결과로 나타내는 것을 보장합니다.

예시를 보겠습니다:

트랜잭션 1: R(X), W(X)
트랜잭션 2: R(X), W(X)

가능한 시리얼 스케줄:

  1. T1 후 T2: R1(X), W1(X), R2(X), W2(X)
  2. T2 후 T1: R2(X), W2(X), R1(X), W1(X)

동시 스케줄이 시리얼라이즈 가능하다면, 그 결과는 위의 시리얼 스케줄 중 하나와 동등합니다.

동등한 스케줄(Equivalence Schedules)

두 스케줄이 다음 조건을 만족하면 동등하다고 간주됩니다:

  1. 동일한 트랜잭션 세트를 포함합니다.
  2. 비 중지된 트랜잭션의 충돌 연산을 동일한 순서로 정렬합니다.

예시를 보겠습니다:

스케줄 1: R1(X), R2(X), W1(X), W2(X) 스케줄 2: R2(X), R1(X), W1(X), W2(X)

이 스케줄은 동등합니다. 충돌 연산(W1(X)와 W2(X))이 두 스케줄에서 동일한 순서로 나열되기 때문입니다.

트랜잭션 상태

트랜잭션은 생명 주기 동안 다양한 상태를 거칩니다. 다음 표는 이 상태들을 요약합니다:

상태 설명
Active 초기 상태; 트랜잭션이 실행 중인 동안 이 상태에 머문다
부분 커밋 최종 문장이 실행된 후
실패 정상적인 실행이 더 이상 가능하지 않을 때
중지 트랜잭션이 롤백되고 데이터베이스가 트랜잭션이 시작하기 전 상태로 복구될 때
커밋 트랜잭션이 성공적으로 완료될 때

이 상태들을 이해하는 것은 트랜잭션을 효과적으로 관리하고 데이터 일관성을 보장하는 데 필수적입니다.

결론적으로, 트랜잭션은 데이터베이스 관리 시스템의 기본 개념으로, 데이터 일관성과 효율성을 보장합니다. ACID 속성, 시리얼라이즈 가능성, 동등한 스케줄, 그리고 트랜잭션 상태를 이해하면 데이터베이스 전문가로서의 길에 한 걸음 더 다가서게 됩니다!

기억하시라, 연습이 완벽을 만든다. 이 개념들을 실제 데이터베이스 시스템에 구현해보시면 트랜잭션의 강력함을 직접 경험하게 될 것입니다. 행복하게 코딩하세요, 미래의 데이터베이스 관리자 여러분!

Credits: Image by storyset