트랜잭션(Transaction)이란??
트랜잭션은 데이터베이스에서 수행되는 "작업의 논리적 단위"를 말한다.
“더 이상 분할이 불가능한 업무처리의 단위”라고도 말한다. 하나의 작업을 위해 더 이상 분할될 수 없는 명령들의 모음이며 즉 한꺼번에 수행되어야 할 일련의 연산모음을 의미한다.
이 모든 작업이 완료되거나(Commit), 실패하여 취소(Abort)되어야 한다.
- 참고
- 예를 들어 SELECT문, INSERT문 이렇게 명령문마다 하나씩 트랜잭션의 작업의 단위가 아니라는 것
- 작업 단위는 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미
- 트랜잭션의 작업의 단위는 SQL 한 문장이 아님!!
- 예시 : 은행 계좌 이체(A계좌→B계좌)
- 계좌 A에서 100만원 출금
- 계좌 B로 100만원 입금
START TRANSACTION
-- 이 블록안의 명령어들은 마치 하나의 명령어 처럼 처리됨
-- 성공하던지, 다 실패하던지 둘중 하나가 됨.
A의 계좌로부터 인출;
B의 계좌로 입금;
COMMIT
트랜잭션의 특징 4가지(ACID)
1. 원자성(Atomicity)
트랜잭션은 모두 실행되거나 모두 실행되지 않아야 한다 !
- 트랜잭션은 사람이 설계한 논리적인 작업 단위이기에, 일 처리는 작업 단위별로 이루어져야 다루는데 무리가 없음
데이터베이스에서 테이블의 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면, 결과를 재반영 하는 것이 아니라 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성공하였을때 만 그 결과를 반영한다.
- 예시 : A계좌에서 B계좌로 계좌 이체할 때 출금과 입금 작업 중 하나라도 실패하면 전체 트랜잭션이 취소된다.
2. 일관성(Consistency)
트랜잭션이 수행된 후 데이터는 항상 일관된 상태를 유지해야 한다.
- 예를 들어 “계좌 잔액은 마이너스가 되면 안 된다, 상품 재고는 음수가 될 수 없다.” 같은 제약 조건들이 항상 지켜져야 한다.
3. 독립성(Isolation)
둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다.
- 예시 : 다른 트랜잭션이 계좌 A의 잔액을 읽는 경우, 트랜잭션 완료 전에는 변경 사항을 볼 수 없어야 한다.
4. 지속성(Durability)
트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다.
- 예시 : 계좌 이체가 완료되면 시스템 장애가 발생하더라도 변경 내용이 영구적으로 보존되어야 한다.
트랜잭션 상태
활성(Active)
트랜잭션이 시작되어 작업을 수행 중인 상태
- 트랜잭션이 아직 완료되지 않았으며, 중간에 데이터베이스에 변경 작업(insert, update 등)을 수행할 수 있다.
부분 완료(Partially Committed)
트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태
- 모든 쿼리가 실행이 완료된 상태지만 아직 DB에 영구적으로 반영되지 않음(commit 전)
- 데이터베이스가 모든 작업이 완료되었는지, 시스템에 오류는 없는지 확인
완료 (Committed)
- 트랜잭션이 성공적으로 완료되고 DB에 영구적으로 반영된 상태
- 이후 트랜잭션 결과를 다른 트랜잭션에서도 볼 수 있다.
실패 (Failed)
- 트랜잭션 실행 중 오류가 발생하거나 조건을 만족하지 못해 중단된 상태
- 롤백(rollback)할 준비
철회 (Aborted)
- 트랜잭션이 실패한 후, 데이터베이스가 트랜잭션의 모든 변경 작업을 취소하고 초기 상태로 복구한 상태
- 롤백(rollback)이 완료된 상태
'CS > Database' 카테고리의 다른 글
Database Replication (0) | 2025.02.24 |
---|---|
[MySQL] 스토리지 엔진 수준의 잠금(LOCK)의 종류 (0) | 2025.02.18 |
[MySQL] 트랜잭션 격리 수준(Isolation Level) (0) | 2025.02.18 |