트랜잭션 (Transaction)
- 통상적으로 정보의 교환이나 데이터베이스의 갱신 등 일련의 작업들에 대한 연속 처리 단위를 의미하고, 데이터베이스의 무결성이 보장되는 상태에서 요청된 작업을 완수하기 위한 작업의 기본 단위로 간주
- 간단하게 말하면 “데이터베이스의 상태를 변화 시키는 작업의 모음”
- DML (Data Manipulation Language)
COMMIT과 ROLLBACK
COMMIT
- Transaction은 COMMIT (확정 신호) 해야지 데이터 베이스에 반영된다.
- 예를들어, 위에서 "A 가 B 에게 100 만원을 입금 해야 한다" 라는 트랜잭션을 실행한 뒤 확정 신호를 보내야 데이터베이스에 반영이 됩니다. 확정 신호 를 보내지 않는다면 데이터베이스에 내용에 변화가 이루어지지 않게 됩니다.
ROLLBACK
- COMMIT과는 반대되는 개념
- 앞으로 변경될 작업에 대한 내용을 취소한다는 개념 즉, Transaction 수행 중에 지금까지 수행한 내용을 모두 취소하겠다 라는 의미
Transaction 정리
- Transaction이란 여러 개의 작업들을 하나의 실행 Unit으로 묶어준 것
- 각 Transaction은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 끝이 난다.
- 만일 한 개의 작업이라도 실패하게 된다면 전부 실패를 하게 된다
ACID
ACID는 Atomicity, Consistency, Isolation, Durability , 각 단어는 database 내에서 일어나는 하나의 Transaction이 보장하는 성질
Atomicity (원자성)
- 하나의 Transaction을 구성하는 작업들은 전부 성공하거나 전부 실패해야 되어야 하는 것
- Transaction 묶인 과정이 모두 성공적으로 진행이 되거나 하나라도 실패하면 실패하게 만드는 것이 해당 성질의 핵심입니다.
- 여러 개의 쿼리를 Transaction으로 묶어서 실행했는데 부분적으로 실패하는 부분이 있다면 전부 실패하고 ROLLBACK 하게 되어 있습니다.
Consistency (일관성)
- 하나의 Transaction 이전과 이후 database 상태는 이전과 같이 유효해야 한다는 뜻
- 즉, database의 제약이나 규칙에 의거한 database 이어야 한다.
예를 들어 user 테이블을 생성한 쿼리가 다음과 같습니다. 이것도 데이터베이스의 제약/규칙이라고 할 수 있겠죠?
CREATE TABLE user (
id varchar(10) primary Key,
value varchar(10)
);
다음과 같은 트랜잭션들은 Consistency 성질을 위반합니다.
- id 가 없는 새로운 고객을 추가하는 쿼리
- 기존 user의 value만을 삭제하는 쿼리
Isolation (고립성, 독립성)
- Isolation은 하나의 Transaction이 다른 Transaction과 독립되어야 한다는 뜻
- 동시에 여러 개의 Transactions가 수행될 때에 각 Transaction은 Isolation되어 있어 연속으로 실행된 것과 동일한 결과를 나타내야 합니다.
마이너스 통장이 될 수 없는 A 계좌에 만 원이 있다고 가정해 보겠습니다. (T: Transaction)
- T1: A 계좌로부터 B 계좌로 육천 원 이체
- T2: A 계좌로부터 C 계좌로 육천 원 이체
동시에 두 Transaction을 실행하고 성공한다면, 데이터베이스를 관리하는 은행은 이천 원의 손해를 보게 됩니다. 그렇기 때문에 두 개의 Transaction이 동시에 실행된다고 하더라도 연속으로 하는 것과 동일한 결과를 나타내야 합니다.
다른 방식으로 설명해 보자면, 각 Transaction은 다른 Transaction의 연산을 방해하면 안됩니다.
- T1이 실행되고 있는데 T2가 실행된다면 T2는 T1이 끝날 때까지 보류되어야 합니다.
- T2가 실행되고 있는데 T1이 실행된다면 T1은 T2가 끝날 때까지 보류되어야 합니다.
즉, Isolation 원칙에 따라 A 의 계좌에는 만 원밖에 없기 때문에 동시에 실행되더라도 T1과 T2 중 하나만 성공해야 합니다.
Durability (지속성, 내구성)
- Durabiliy은 Transaction COMMIT이후 Disk에 저장된 database의 state는 유지되어야 한다는 뜻
- 즉, 하나의 Transaction이 성공적으로 수행되었다면 해당 Transaction에 대한 log가 남고 Runtime error나 System error가 발생해도 해당 기록은 영구적이어야 한다는 뜻
간단한 예로 은행에서 계좌 이체를 성공적으로 한 뒤에 해당 은행이 정전 되어 데이터베이스에 오류가 발생하더라도 계좌 이체 내역은 남아야 합니다.
반대로 Transaction을 수행하는 도중에 시스템 오류 등에 의해 종료가 된다면 해당 이체 내역은 Atomicity에 의해 실패로 돌아가고 각 계좌들은 계좌 이체 이전 상태들로 돌아가게 됩니다.
'Data Engineer' 카테고리의 다른 글
RESTful API란? (0) | 2023.08.14 |
---|---|
Status code 정리 (100 ~ 500) (0) | 2023.05.08 |
Data Models이란? (0) | 2023.05.08 |
DBMS vs RDBMS의 차이 (0) | 2023.05.08 |
SQL이란? (0) | 2023.05.08 |