트랜잭션 (Transaction)이란 ?
트랜잭션이란 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.
DML(Data Manipulation Language)를 통해 데이터베이스에 접근하는 것을 의미한다.
작업 단위란 ?
그렇다면 작업 단위라는 것은 무엇을 말하는 것일까 ?
작업 단위는 사용자가 특정 기능을 수행을 위해 SQL 작업을 묶은 단위를 의미한다.
A가 B에게 돈을 보내는 송금 서비스를 생각해보자 송금 서비스는
1. A가 돈을 보낸다.
2. B가 그 돈을 안전하게 받는다.
라는 두가지 작업이 완료되어야 완전히 실행되었다고 할 수 있다.
만약 두 과정이 별개의 트랜잭션 즉, 별개의 작업 단위로 분리되어 실행되었다고 생각해보자
A가 돈을 10,000원 송금하면 A의 잔액 데이터에서 10,000이 차감될 것이다. 그에 맞춰 B의 잔액에는 10,000원이 추가될 것이다.
만약 돈을 보내는 로직에서 오류가 발생해 트랜잭션 rollback이 일어난다면 A의 잔액 데이터는 다시 10,000원이 추가됨으로써 원상복구 될 것이다. 하지만 B가 돈을 받는 작업은 다른 트랜잭션으로 분류되었기에 아무런 rollback도 일어나지 않기 때문에 돈이 추가된 상태로 남게된다.
송금 과정을 하나의 작업 단위로 묶지 않으면 당사자들간의 데이터 불일치가 나타날 수 있다.
우리는 두 과정을 하나의 트랜잭션으로 묶어야 한다. 그래야 중간에 문제가 발생해도 두 과정 모두 rollback이 일어날 수 있다.
이와 같이 작업 단위를 잘 설정하는 것은 서비스를 구성함에 있어서 매우 중요한 부분이다.
트랜잭션이 성공적으로 마무리 되었다면 commit을 호출해서 수정 사항을 DB에 영구적으로 반영하고 중간에 오류가 발생했다면 rollback을 호출해서 트랜잭션 내부의 모든 작업을 원상복구 시킨다.
트랜잭션 특성 4가지
원자성(Atomicity)
트랜잭션이 DB에 모두 반영되거나 혹은 전혀 반영되지 않아야 된다. 한마디로 All or Nothing이다.
시스템이 다운되는 경우 DBMS의 복구 모듈은 트랜잭션에 의해 부분적으로 갱신된 작업을 취소하여 원자성을 보장한다.
ex) 이체 과정 중에 트랜잭션이 실패해 예금이 사라지는 경우가 발생해서는 안되므로 DBMS는 완료되지 않은 트랜잭션의 중간 상태를 데이터베이스에 반영해서는 안된다.
일관성(Consistency)
트랜잭션은 트랜잭션이 시작되기 전과 종료된 후에 데이터베이스가 올바르고 일관된 상태가 되도록 처리되어야 한다.
즉, 한 트랜잭션을 정확하게 수행하고 나면 데이터베이스가 하나의 일관된 상태에서 다른 일관된 상태로 바뀐다.
트랜잭션의 수행을 데이터베이스의 상태 간의 전이(transition)로 봤을 때, 트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다.
트랜잭션 수행이 보존해야 할 일관성은 기본키, 외래키 제약과 같은 명시적인 무결성 제약 조건들 뿐만 아니라 자금 이체 예에서 두 계좌 잔고의 합은 이체 전후가 같아야 하는 사항과 같은 비명시적인 일관성 조건도 있다.
독립성(Isolation)
둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
한 트랜잭션에서 데이터베이스를 변경한 내용은 트랜잭션이 커밋되기 전까지는 다른 어떤 질의나 트랜잭션과도 고립되어야만 한다.
즉, 각 트랜잭션은 시스템 내에서 동시에 수행되고 있는 다른 트랜잭션들을 알지 못한다. 한 트랜잭션의 중간 결과가 다른 트랜잭션에게는 숨겨져야 한다는 의미인데 이러한 isolation 성질이 보장되지 않으면 트랜잭션이 원래 상태로 되돌아갈 수 없게 된다.
DBMS의 병행 제어 모듈이 트랜잭션의 고립성을 보장한다.
지속성(Durability)
트랜잭션이 성공적으로 완료되었으면 결과는 영구적으로 반영되어야 한다.
데이터베이스 시스템은 데이터베이스의 현재 상태가 유실되지 않도록 시스템 충돌 등의 문제로부터 복구할 수 있는 방법을 갖추고 있어야 한다.
DBMS의 복구 모듈은 시스템이 다운되는 경우에도 트랜잭션의 지속성을 보장한다.
트랜잭션의 Commit과 Rollback
Commit : 모든 작업이 성공적으로 처리되면 모든 변경 내용을 한꺼번에 반영시킨다.
Rollback : 한 트랜잭션에 속하는 작업 중 단 하나라도 실패하면 트랜잭션 전체가 실패한 것으로 간주하고 그 트랜잭션에서 데이터베이스를 변경한 내용을 전부 원래대로 되돌린다.
savePoint
savePoint는 트랜젝션 내부에서 사용자가 지정할 수 있는 세부 작업 단위라고 생각할 수 있다.
아래의 그림처럼 특정 지점에 savePoint를 설정 한 후 Rollback to savePoint1을 통해 해당 지점으로 롤백 할 수 있다.
기억해야할 점은 아래 그림에서 SP1으로 롤백을 한 뒤에는 미래 시점인 SP2의 savePoint는 삭제 된다는 것이다.
트랜잭션의 상태
트랜잭션은 논리적으로 5가지의 상태에 있을 수 있다.
- Active : 트랜잭션이 현재 실행 중인 상태
- Failed : 트랜잭션이 실행되다 오류가 발생해서 중단된 상태
- Aborted : 브랜잭션이 비정상 종료되어 Rollback이 수행된 상태
- Partially Committed : 트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태
- Committed : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
참고
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 무결성 (Integrity) (0) | 2022.07.26 |
---|---|
[데이터베이스] 트랜잭션의 격리 수준 (0) | 2022.07.26 |
[데이터베이스] 정규화 (Normalization) (0) | 2022.07.22 |
[데이터베이스] Index (인덱스) (0) | 2022.07.22 |
[데이터베이스] Anomaly (이상 현상) (0) | 2022.07.22 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!