트랜잭션이란
트랜잭션이란, 데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위한 가장 최소한의 작업 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연상들을 의미한다. 즉, 쉽게 말하면 더이상 분할이 불가능한 업무처리의 단위이다. 하나의 작업을 위해 더이상 분할될 수 없는 명령들의 모음이자 한꺼번에 수행되어야 할 일련의 연산모음을 의미한다.
예를 들어, 은행 시스템에서 고객 A와 고객 B 간의 자금 이체를 수행하는 상황이다.
A계좌에서의 출금과 B계좌로의 입금이 모두 성공적으로 이루어져야 이체 트랜잭션이 성공적으로 완료된다 → 원자성
이체 전에 각 계좌의 총 잔액이 일치하고, 이체 후에도 동일한 조건이 유지되어야 한다. → 일관성
다른 고객이 동시에 계좌를 조작하더라도, 각 트랜잭션은 서로에게 영향을 주지 않고 독립적으로 실행되어야 한다. → 고립성
이체가 완료되면 이 정보는 데이터 베이스에 저장되어야 하며, 장애 발생 시에도 이 정보가 보존되어야 한다. → 지속성
이 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability) 을 충족하는 트랜잭션은 안전하게 수행될 수 있으며 데이터베이스의 일관성과 무결성을 보장한다.
또한, 트랜잭션 작업의 단위는 질의어 한문장이 아니다. 작업단위란, 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미하기 때문에 트랜잭션 내 여러 질의어가 포함될 수 있다.
트랜잭션 성질
트랜잭션은 위의 4개의 성질을 가지고 있다. 하나씩 뜯어보자.
- Atomicity(원자성)
- 트랜잭션의 연산은 데이터베이스에 모두 반영되거나, 아니면 전혀 반영되지 않아야 한다.
- 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
- Consistency(일관성)
- 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
- 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아닌 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다.
- Isolation(고립성)
- 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우, 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.
- 수행중인 트랜잭션은 완전히 완료될 때 까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
- Durability(지속성)
- 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.
트랜잭션 상태
트랜잭션의 연산과정 단계를 도식화하고 각각의 단계의 상태를 아래 그림과 같이 정리할 수 있다.
- 활성(Active): 트랜잭션이 정상적으로 실행중인 상태
- 트랜잭션이 시작되면 해당 트랜잭션의 상태는 활동(Active)상태가 된다.
- 해당 상태는 설계자가 설계한대로 연산들이 정상적으로 실행중인 상태를 의미한다.
- 부분 완료(Partially Committed): 트랜잭션의 마지막 연산까지 생행했지만 commit 연산이 실행되기 직전의 상태
- 설계된 작업대로 작업이 성공하면 무조건 반영하는 것이 아닌 최종 승인인 commit이 있을 때 까지 반영하지 않고 기다리고 있는 상태이다.
- 완료(Committed): 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태
- 설계자가 작업 결과에 대해 반영을 승인(commit)한다면 트랜잭션이 성공적으로 종료된다.
- 실패(Failed): 트랜잭션 실행에 오류가 발생하여 중단된 상태
- 트랜잭션을 수행하는 중간에 오류가 발생하여 실행이 중단된다.
- 철회(Aborted): 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 트랜잭션이 비정상적으로 종료되어 설계되어 있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 Rollback 연산을 수행한다.
트랜잭션 연산
- Commit: 모든 작업들을 정상 처리하겠다고 확정하는 명령어
- 해당 처리 과정을 DB에 영구 저장하겠다는 의미이며 commit을 수행하면 하나의 트랜잭션 과정이 종료된다.
- commit을 수행하면 이전 데이터가 완전히 반영되어 UPDATE 된다.
- Rollback: 작업 중 문제가 발생되어 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어
- 해당 명령을 트랜잭션에 하달하면 트랜잭션이 시작되기 이전의 상태로 되돌아간다.
- 즉, 마지막 commit을 완료한 시점으로 돌아가여 예전 상태를 복구하는 것이다.
트랜잭션 예외
DDL문 (CREATE, DROP, ALTER, RENAME, TRUNCATE)는 트랜잭션의 rollback 대상이 아니다.
후기
데이터엔지니어로써 트랜잭션을 효과적으로 다루기 위해서는 데이터베이스 시스템의 특성과 해당 시스템에서 제공하는 기능을 잘 이해하여 적절한 데이터베이스를 선택해야 할 거 같다. 또한, 여러 질의어를 하나의 트랜잭션으로 정의할 때 이 범위를 적절히 정의하는 것이 중요해 보인다. 그리고 commit과 rollback의 적절한 전략을 구현하는 것도 중요해 보인다. 이러한 관점에서 트랜잭션을 다루면 데이터의 신뢰성을 높이는 엔지니어가 될 수 있을 거 같다.