꾸물꾸물 졔의 개발공부
[DB] 트랜잭션(Transaction)이란? ACID, COMMIT, ROLLBACK 본문
트랜잭션(Transaction)
트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다.
- 상태를 변화시킨다 = 질의어(SQL: SELECT, INSERT, DELETE, UPDATE)를 이용하여 DB에 접근
- 작업 단위 = 사람이 정하는 기준에 따라 한꺼번에 모두 수행되어야 할 일련의 연산(SQL)
예를 들어, A가 B에게 오만원을 보낸다.
이때 DB에서는,
1. 사용자 A의 잔액에서 오만원을 차감한다 = UPDATE문으로 A의 잔액 변경
2. 사용자 B의 잔액에 오만원을 추가한다 = UPDATE문으로 B의 잔액 변경
작업 단위 : 차감UPDATE + 추가UPDATE
> 이를 통틀어 하나의 트랜잭션이라고 한다.
> 두개의 쿼리문이 모두 성공적으로 완료되어야만 하나의 작업 즉, "트랜잭션"이 완료된다. 'Commit'
> 둘 중 하나라도 실패하면 모든 쿼리문을 취소하고 이전 상태로 돌려놓아야 한다. 'Rollback'
트랜잭션은 작업의 완정성과 데이터베이스의 안정성을 보장해준다. 즉, 논리적인 작업 단위를 모두 완벽하게 처리하거나 또는 하나라도 처리하지 못할 경우, 이전 상태로 복구해서 작업의 일부만 적용되는 현상을 방지한다.
트랜잭션의 특징(ACID)
데이터의 무결성을 보장하기 위해 DBMS의 트랜잭션이 가져야 할 특징으로, 각 특징의 첫 글자를 따서 ACID라고 한다.
1) Atomicity(원자성)
- 트랜잭션의 연산은 데이터베이스에 모두 반영되거나, 또는 전혀 반영되지 않아야 한다.
- 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어 하며, 부분적으로 실행되거나 중단되어서는 안된다.
- 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
2) Consistency(일관성)
- 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
- 시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전/후의 상태가 같아야 한다.
3) Isolation(독립성, 격리성)
- 두개 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우, 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다.
- 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조 할 수 없다.
4) Durability(영속성, 지속성)
- 트랜잭션이 성공적으로 완료되었을 경우엔, 그 결과가 영구적으로 반영되어야 한다.
트랜잭션의 Commit과 Rollback
1) Commit
Commit 연산은 하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성 있는 상태에 있음을 의미한다.
2) Rollback
Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 상태를 의미한다.
트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 지키기 위해 해당 트랜잭션이 행한 모든 연산을 재시작하거나 취소(Undo) 해야 한다.
트랜잭션의 상태
- 활동(Active) : 트랜잭션이 실행 중인 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행되고, commit 연산이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 이후의 상태
- 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단 된 상태
- 취소(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
💡부분완료와 완료의 차이점
모든 작업 단위의 SQL문이 수행되고 commit 요청이 들어오면 상태는 부분완료 상태가 된다. 이후 commit을 문제없이 수행 했다면 완료 상태로 전환이 되고, 만약 오류가 발생한다면 실패가 된다. 즉, 부분완료는 commit 요청이 들어왔을 때를 말하며 완료상태는 commit 연산까지 정상적으로 수행한 상태를 말한다.
'CS' 카테고리의 다른 글
[CS/JAVA] JVM이란? (0) | 2023.08.23 |
---|---|
[CS] Blocking/Non-blocking , Sync/Async (1) | 2023.05.11 |
[DB] JOIN문, JOIN의 종류 : INNER, OUTER, CROSS, SELF (0) | 2023.04.29 |
[CS] Cache(캐시) 란? (0) | 2023.04.19 |
[DB] SQL vs NoSQL (0) | 2023.03.10 |