[DBMS] Transaction (트랜잭션) 개념 정리
2021. 10. 16. 00:32
반응형
DB는 다양한 사용자가 동시에 만지고 수정합니다. 이러한 동시 다발적인 사용에서 오류가 발생해서 안되고 또한 빠르게 작업들을 처리해야 하는데 어떤 방법으로 가능한지 궁금했습니다. 공부를 통해 데이터 무결성을 확보하면서 이런 작업을 가능하게 하는 트랜잭션에 대해 정리합니다. 개념을 쉽게 쓰는 게 어려워 예시를 많이 사용했습니다.
🔹 트랜잭션?
다양한 정의가 있어 아래와 같이 정리했습니다. 지금 정의가 이해되지 않으면 예시를 보고 다시 돌아와도 좋습니다.
- 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업 단위
- 한꺼번에 모두 수행되어야 할 일련의 연산
- 데이터 베이스의 DML(데이터 조작어, 조회&삽입&수정&삭제)의 논리적인 작업
- DML 실행과 실행에 대한 커밋(or 롤백) 단계
- (Select 조회 ->) DML 실행 -> Commit/Rollback -> 결과 순서로 진행
🔹 트랜잭션의 특징 (ACID)
특징을 먼저 설명하면 아래와 같습니다. 예시와 비교를 통해 하나씩 이해 봅시다.
- 원자성 (Atomicity): 트랜잭션의 결과는 이루어졌거나 아무 일도 없었거나 둘 중 하나이다.
- 일관성 (Consistency): 트랜잭션이 성공하면 DB는 일관성이 보장되어야 한다.
- 고립성 (Isolation): 트랜잭션은 서로 중간 결과를 주고받지 않는다.
- 지속성 (Durability): 해당 트랜잭션이 성공하면 DB에 결과 반영은 영구적이다. (일시적이지 않다)
예시
A가 B에게 돈을 이체한다고 가정합니다. 돈의 기록은 은행 DB에 저장되어 있습니다.
- A가 이체를 요청했는데 A 휴대폰이 갑자기 꺼져서 완전하게 이체가 진행되지 않았다면, 원자성에 따라 아무 일도 발생하지 않았다.
- 만약 정상 이체가 되었다면, A는 돈이 빠져나가고 B는 그만큼 돈이 들어와서 일관성을 만족해야 한다. 둘 다 돈이 나가거나 둘 다 돈이 남아있을 수 없다.
- A가 계좌에서 돈을 빼고 있는데, 부모님 AA가 계좌에 요청해서 돈을 뺄 수 없다. A가 요청한 트랜잭션이 완료되고 나서 다음에 AA의 트랜잭션이 수행된다. 또한, A가 계좌에서 돈을 빼라는 트랜잭션은 다른 누군가의 명령들을 참고하여 수행되지도 않는다.
- A의 이체 트랜잭션이 끝나면 기록은 DB에 저장되어 변경 전까지 남는다.
🔹 트랜잭션 과정
대충 감이 오신다면, 좀 더 각 과정을 구체적으로 보겠습니다.
위 예시를 통해 DB가 반영되는 모습을 생각한다면 그림 이해가 가능할 것입니다.
여기서 추가적인 화살표는 완료(commit) -> 철회(Rollback)입니다. 커밋이 발생하더라도 다시 철회가 가능합니다.
- Commit: 트랜잭션의 모든 변경을 DB에 영구적으로 반영한다.
- Rollback: 트랜잭션의 진행되던 변경을 포기하고 원래 모습으로 되돌린다.
트랜잭션은 SQL을 사용하며 수동 또는 자동적으로 수행됩니다. 따라서 내가 쓰는 SQL이 어떤 트랜잭션 특징을 가지는지 알아야 합니다. 일반적으로 DML 명령은 수동으로 커밋이 요구되며, DDL 명령은 자동적으로 커밋이 수행됩니다.
🔹 동시성 제어
맨 처음 어떻게 DB에 여러 사람이 만지는데 오류 없이 잘 돌아가는지 이제 설명이 가능합니다. 이를 가능하게 만드는 개념이 동시성 제어입니다. 우선 동시성 제어를 이해하기 위해 이 개념이 없을 때 발생되는 문제와 동시성 제어의 해결 방안을 알아보겠습니다. 아래 문제와 해결 방안은 여러 글에서 많이 설명되는 개념만 가져왔습니다.
발생 문제
- 불일치 현상
두 명 이상의 사용자가 DB를 조작할 때 발생. 같은 데이터를 조작할 때 이상한 결과값이 저장되는 현상 - 갱신 손실
트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어쓰면서 이전 트랜잭션을 무효화하는 현상 - 연쇄 복귀
트랜잭션이 변경을 취소하고 롤백하려 할 때, 다른 트랜잭션으로 인해 취소가 불가능하게 되는 현상
해결 방안
- 로킹(locking)
트랜잭션이 데이터에 로킹을 설정하면 다른 트랜잭션은 해당 데이터를 조작할 수 없다. - 타임스탬프(timestamp)
트랜잭션이 발생하면 접수번호를 부여하여 순서대로 처리한다. - 적합성(validation) 검증
트랜잭션을 수행하고 종료할 때 적합성을 검증하여 DB에 최종적으로 반영한다.
반응형