-
[DB] 트랜잭션database/DB Concept 2021. 11. 23. 19:25
# A친구의 통장 잔액은 300,000원 일때, UPDATE account SET balance = balance - 500000 WHERE name = 'A';
[DB]트랜잭션
트랜잭션이란
데이터베이스 트랜잭션은 일반적으로 데이터베이스의 모든 변경 사항을 나타냅니다.
트랜잭션은 논리 또는 작업의 단일 단위이며 때로는 여러 작업으로 구성됩니다. 데이터베이스의 일관된 모드에서 수행되는 모든 논리적 계산을 트랜잭션이라고 합니다.
트랜잭션은 왜 필요할까?
친구에게 빌린 돈 10,000원을 이체했습니다. 그런데 예기치 못한 오류가 발생해 버렸습니다.
제 계좌에서는 10,000원이 출금되어 나갔는데 친구 계좌에는 입금이 되지 않았습니다.
이러한 상황이 발생하지 않도록 중간에 거래가 실패하면 처음의 상태로 되돌려야(rollback) 합니다.
ACID
트랜잭션은 ACID라 불리는 특성이 있습니다.
Atomicity(원자성)
트랜잭션 내의 모든 명령은 반드시 모두 수행되어야 하며, 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
------------------------------ START TRANSACTION; ------------------------------ ------------------------------ #1.A의 통장에서 10,000원을 차감한다. UPDATE account SET balance = balance - 10000 WHERE name = 'A'; ------------------------------ ------------------------------ #2. B의 통장에서 10,000원을 받는다. UPDATE account SET balance = balance + 10000 WHERE name = 'B'; ------------------------------ ------------------------------ COMMIT; ------------------------------
친구A가 친구B에게 10,000원을 송금한다고 생각해 보면, #1.A의 통장에서 10,000원을 차감한다. #2.B의 통장에서 10,000원을 받는다 모두 성공해야만 합니다.
트랜잭션이 내에서 SQL이 단하나라도 실패했으면 트랜잭션 내의 SQL은 모두 취소(rollback)되어야 합니다.
즉, 트랜잭션 내에서의 모든 작업이 성공하거나, 실패해야만 합니다.
Consistency(일관성)
트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 말한다.
계좌 잔액 칼럼에는 잔액이 0원 이상이여야 한다는 룰이 걸려 있습니다.
A친구가 500,000원을 이체하려고 하는데, 실제 통장에는 300,000원 뿐입니다. 500,000원을 뺴니 잔액이 마이너스가 되며 잔액에 0원 이상이여야 한다는 룰을 위반하게 됩니다.
DBMS는 룰을 위반했으므로 트랙잭션을 취소합니다.
Isolation(독립성,격리성)
트랜잭션 여러개가 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들지 못하도록 보장한다.
10,000원을 이체하는 동시에 친구가 점심 밥 값으로 8,000원을 이체하고 있습니다. 두 개의 트랜잭션은 서로 다른 트랙잭션이므로 각각 동작해야 합니다.
Durablility(영속성,지속성)
성공적으로 수행된 트랜잭션은 영구적으로 반영되어야 한다.
Post
- 2022.01.31 - [database/DB Concept] - [DB] 트랜잭션 격리수준 (Isolation Level)
- 2021.11.25 - [database/DB Concept] - [DB] 트랜잭션의 장애와 복구
References
잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)
'database > DB Concept' 카테고리의 다른 글
[DB] 트랜잭션 격리수준 (Isolation Level) (0) 2022.01.31 [DB] 트랜잭션의 장애와 복구 (0) 2021.11.25 [데이터베이스]옵티마이저 (Optimizer) (1) 2021.07.13 [데이터베이스] 인덱스(INDEX) (0) 2021.07.12 [DB] NoSQL 처음보는 초보 개발자가 쓰는 NoSQL이란? (0) 2021.02.01