일주일 전쯤, MS SQL의 BEGIN TRAN 덕분에 겪었던 삽질에 대해 글을 쓰며
트랜잭션의 개념에 대해 잘 모른다는 생각이 들었다.
그래서 아래 글들을 참고하여 공부하였고,
정리 글을 남긴다.
출처)
2. Naver D2) DBMS는 어떻게 트랜잭션을 관리할까?
3. Tistory) 트랜잭션(Transaction)이란?
4. Tistory) [DB기초] 트랜잭션이란 무엇인가?
데이터베이스 트랜잭션?
위키백과에서는 트랜젹션을 아래와 같이 정의하고 있다.
"데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위"
여기서 "유사한 시스템"이란
트랜잭션의 성공과 실패가 분명하고,
트랜잭션이 상호 독립적이며,
일관되고 믿을 수 있는 시스템을 의미한다.
조금 더 쉽게 풀어 말하자면,
하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합을 트랜잭션이라고 한다.
즉, 트랜잭션을 사용하면 DB의 상태를 변화시킨다는 것인데,
우리가 잘 아는 SELECT, INSERT, DELETE, UPDATE와 같은
질의어(SQL)로 DB에 접근하는 것을 의미한다.
주의해야 할 점은, SQL 한 문장만이 작업 단위는 아니라는 것이다.
트랜잭션을 작성하는 개발자에 따라 다르겠지만,
한 줄이 될 수도 있고, 여러 줄이 될 수도 있다.
간단한 트랜잭션은 아래 양식의 SQL 언어로 DB 내에서 실행된다.
1) BEGIN the transaction
2) EXECUTE several queries (아직 DB 내에 갱신이 적용되지 않는다)
3) COMMIT the transaction (트랜잭션 성공, 갱신이 실제 적용됨)
만약 2단계에서 쿼리들 중 하나가 실패하면,
DBMS는 전체 트랜잭션 또는 실패한 쿼리를 ROLLBACK한다.
이것은 DBMS가 어떻게 사용되고 설정 되었느냐에 따라 다른데,
트랜잭션은 COMMIT 전에 언제든지 수동으로 ROLLBACK 될 수 있다.
이와 관련된 내용은 글 마지막 부분에서 살펴보자.
작업 단위의 예시
헬스에 관한 글을 올리는 온라인 게시판이 있다고 가정하자.
사용자는 게시글을 작성하고
1) 올리기 버튼을 누르면
2) 다시 게시판에 왔을 때 자신이 올린 글을 포함한 업데이트된 게시판을 보게 된다.
이 상황을 DB 작업 관점에서 보자면,
1) 올리기 버튼을 누르면 INSERT 문을 사용하여 입력한 게시글을 DB에 넣고
2) 게시판의 게시글을 새롭게 불러와야 하므로
SELECT 문을 통해 최신 정보로 유지한다.
여기서 트랜잭션이라 부르는 하나의 논리적 작업 단위는
INSERT 문과 SELECT 문,
두 개의 질의어로 이루어진다.
이러한 게시판 글 작성 트랜잭션에 이름을 붙여본다면,
CreatePosting 정도가 될 것이다.
그래서 이러한 하나의 트랜잭션 설계를 잘해야
DB 데이터를 다룰 때 많은 이점이 발생한다.
트랜잭션 예시
트랜잭션에 대한 설명이 조금은 추상적이어서 조금 헷갈리는데,
다른 예도 생각해보자.
트랜잭션의 예로는 두 계좌 간의 자금 이체가 자주 언급된다.
만약 내가 갖고 있는 카카오 뱅크 계좌에서 100만 원을
국민 은행 계좌로 입금하는 이체 작업을 한다고 하자.
이체 작업을 크게 나누어 보면,
카뱅 계좌에서 100만 원을 인출하는 작업과
인출한 100만 원을 국민 은행 계좌로 입금하는 작업,
두 개의 작업으로 이체 작업이 이뤄진다고 볼 수 있다.
이러한 모든 작업은 모두 정상적으로 완료되거나,
혹은 하나의 작업이라도 정상적으로 처리될 수 없는 경우에는
아무 것도 실행되지 않은 처음 상태로 되돌려져야 한다.
이처럼, 트랜잭션은 다양한 데이터 항목들을 액세스하고 갱신하는
프로그램 수행의 단위가 된다.
ACID ?
트랜잭션에 대해 공부하다 보면
필연적으로 만나게 되는 용어이다.
각각 Atomicity(원자성), Consistency(일관성),
Isolation(독립성), Durability(영구성)을 뜻하는데,
이론적으로 DB 시스템은 각각의 트랜잭션에 대해
위와 같은 ACID를 보장하기 때문에,
트랜잭션과 항상 붙어 다니는 용어이다.
각 성질에 대해 위에서 언급한
계좌 이체 예시와 함께 자세히 알아보자.
Atomicity(원자성)
트랜잭션은 모든 연산들이 정상적으로 수행 완료되거나,
아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다는 성질이다.
쉽게 'all or nothing' 특성으로 생각하면 되는데,
만약 이체 과정 중에 트랜잭션이 실패한다면,
예금이 사라지는 경우가 발생해서는 안되기 때문에
DBMS는 완료되지 않은 트랜잭션의 중간 상태를 DB에 반영해서는 안 된다.
Consistency(일관성)
일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다.
트랜잭션 수행 전후의 DB 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다.
일관성이 적용되는 예시로는,
기본 키, 외래 키와 같은 시스템이 가지고 있는 고정요소인
명시적인 무결성 제약 조건들뿐만 아니라,
계좌 이체 예에서 두 계좌 잔고의 합은 이체 전후가 같아야 한다 같은
비명시적인 일관성 조건들도 있다.
좀 더 쉽게 설명하자면,
A라는 상태의 DB로 X라는 트랜잭션이 진행되는 동안
특정 요인으로 인해 DB가 변경되어 B라는 상태가 되어도
B 상태의 DB로 X 트랜잭션이 진행되는 것이 아니라,
가장 처음에 참조한 A 상태의 DB로 진행되는 것이다.
Isolation(독립성)
여러 트랜잭션이 동시에 수행되더라도
각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고
독립적으로 수행되어야 한다는 성질이다.
즉, 하나의 특정 트랜잭션이 완료될 때까지
다른 트랜잭션이 해당 트랜잭션의 결과를 참조할 수 없다.
이러한 Isolation 성질이 보장되지 않으면,
만약 특정 트랜잭션이 잘못되었다고 했을 때
트랜잭션이 원래 상태로 되돌아갈 수 없게 된다.
그래서 독립성을 보장하는 가장 쉬운 방법은
모든 트랜잭션을 순서대로 수행하는 것이지만,
병렬적 수행의 장점을 얻기 위해 DBMS는 병렬적으로 수행하면서도
일렬 수행과 같은 결과를 보장할 수 있는 방식을 제공하고 있다.
Durability(지속성)
트랜잭션이 성공적으로 완료되어 COMMIT 되고 나면,
해당 트랜잭션에 의한 모든 변경은
향후에 어떤 소프트웨어나 하드웨어 장애가 발생되더라도
보존되어야 한다는 성질이다.
트랜잭션의 결과 종류
트랜잭션은 아래 표와 같이 세 가지 중 하나의 형태로 종료된다.
표는 가로가 아니라 세로로 해석해야 한다.
가장 왼쪽의 형태처럼 문제 없이 정상적으로 수행된 경우에는
COMMIT을 통해서 종료된다.
가운데 형태처럼 잘못된 입력이 주어졌거나,
일관성 제약 조건을 위배한다거나 하는 상황이 발생되거나,
사용자의 요청에 의해 철회되는 경우는
ABORT(혹은 ROLLBACK)을 통해 취소된다.
가장 오른쪽의 형태처럼 타임 아웃이나 교착 상태 등과 같이
시스템이 감지하는 문제로 인해 DBMS가 철회하는 경우도 존재한다.
이 외에도 트랜잭션은 각종 시스템 고장으로 인해 영향을 받을 수 있고,
DBMS는 이와 같은 상황에서 트랜잭션을 관리해야 한다.
트랜잭션의 상태
위에서 살펴본 트랜잭션의 결과 종류에 대해
그림을 통해 한 눈에 살펴보자.
활동(Active) : 트랜잭션이 실행중인 상태
부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행, COMMIT 연산은 실행 X
실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
완료(Committed) : 트랜잭션이 성공적으로 종료되어 COMMIT 연산을 실행한 후의 상태
철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 ROLLBACK 연산을 수행한 상태
DBMS가 트랜잭션을 관리하기 위한 전략에 대해
좀 더 공부하고 다음 글을 작성할 예정이다.
끝!
'Study > Database' 카테고리의 다른 글
[DB][MSSQL] PIVOT, UNPIVOT으로 여러 컬럼 합치기 (0) | 2021.04.08 |
---|---|
[DB] SQL 작성 표준 가이드 (0) | 2021.02.25 |
[DB][MSSQL] 저장 프로시저(Stored Procedure)란? (0) | 2021.01.22 |
[DB][PostgreSQL] PostgreSQL 완전 삭제하는 방법 (0) | 2020.08.28 |
[DB][생활코딩] Database(데이터베이스) 기초 개념 - 쉬운 설명 (0) | 2020.06.06 |