본문 바로가기
computer science/데이터베이스

[데이터베이스] 트랜잭션(Transaction)

by 박연호의 개발 블로그 2020. 9. 1.

이번시간에는 트랜잭션에 대해 공부해 보겠습니다.

 

트랜잭션이란 데이터베이스를 조작하는 하나의 논리적인 작업단위를 구성하는 연산들의 집합를 의미하며 이 작업들은 모두 실행되거나, 모두 실행되지 않아야 합니다. 또한 트랜잭션은 병행제어(동시제어)와 회복의 논리적 단위입니다.

 

여기서 데이터베이스를 조작한다는 의미는 쿼리문을 이용하여 데이터베이스의 데이터를 조회,삭제,수정,삽입하는 일을 의미합니다. 또한 이런 작업은 여러 쿼리문을 포함할 수 있으며 이 모든 것들이 모두 성공적으로 실행되거나, 오류가 생긴 경우 모두 실행되지 말아야 합니다.

 

트랜잭션의 예로 많이 참고하는 입/출금으로 설명해 보겠습니다.

A가 B에게 10000원을 이체해서 보낸다고 하겠습니다. 이 경우 "A의 계좌에서 10000원 출금, B의 계좌에 10000원 입금"이 작업단위, 즉 트랜잭션을 의미합니다. 이 작업을 수행하는데 A계좌,B계좌 총 2번의 update를 한다고 가정해 봅시다. 이 작업은 모두 성공적으로 끝내거나, 하나라도 문제가 생기면 모두 취소해야 합니다. A에 10000원이 없는데 B에게 10000원을 보낼 수 없으며 B에게 10000원을 입금하는 과정에서 문제가 생기면 10000원은 다시 A에게 주어야 할 것입니다.


Commit, Rollback

트랜잭션의 원자성을 위한 연산에는 Commit(완료), Rollback(복귀) 연상이 있으며 모든 작업을 성공적으로 수행되었을 경우 Commit연산을 하며 도중에 하나라도 문제가 생긴다면 Rollback연산을 해야 합니다. 

 

- Commit 연산

한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝나 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다.

 

- Rollback 연산

하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다.


Undo, Redo

- Undo

트랜잭션을 이전 상태로 되돌리는 것을 의미

 

- Redo

- 이전 상태로 되돌아간 후, 실패가 발생하기 전까지의 과정을 그대로 따라가는 것을 의미

- Redo를 하기 위해서는 정상적으로 실행되기 전까지의 과정을 기록해야 하는데, 이를 log라고 함


트랜잭션 상태

활동 : 트랜잭션이 실행중인 상태

 

부분완료 : 트랜잭션의 마지막 연산 후 DB에 실행결과 반영(commit) 직전의 상태, DB물리적 구조가 아닌 log에 반영됨

 

완료 : 트랜잭션 연산 후 연산의 결과를 DB에 적용(commit)한 상태

 

실패 : 트랜잭션 실행 중 오류 등의 사유로 진행이 어려운 상태

 

철회 : 트랜잭션 실행 시 실패로 인하여 rollback한 상태


트랜잭션의 특징(ACID)

원자성(Atomicity) : 트랜잭션의 중간 상태가 반영되지 않아야 하며 트랜잭션의 연산 결과들이 모두 반영(commit)되거나 모두 취소(rollback)되어야 함

 

일관성(Consistency) : 트랜잭션 완료 후 데이터베이스의 상태가 일관되도록 무결성이 유지해야 함, 시스템이 가지고 있는 고정 요소가 트랜잭션 실행 전과 후 동일한 상태를 유지해야함(기본키, 외래키 제약과 같은 명시적인 무결성 제약조건, 자금의 총량 등...)

 

독립성(Isolation) : 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 함

 

지속성(Durability) : 트랜잭션이 성공적으로 완료된 경우, 그 결과가 이후의 어던 소프트웨어/하드웨어 장애가 발생되더라도 영구적으로 보존되어야함