트랜잭션?
데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업단위이다.
여기서 작업단위라는 말은 사람이 정하는 기준에 따라 달라질 수 있을것이다. 예를들어 A가 B에게 10000원을 송금하는 상황이라고 한다면 A의 계좌에서 -10000만큼 update해준 다음 B의 계좌에서 +10000을 update해줘야 하므로 총 2번의 연산이 필요하다. 이를 통틀어서 하나의 트랜잭션(송금)이라고 하며 두번의 update가 정상적으로 완료되면 트랜잭션을 commit한다고 말하며, 중간에 오류가 발생해서 update가 제대로 수행되지 않았다면 Commit 하지 못하고 이전상태로 돌려놓는다는 뜻의 rollback을 한다고 말한다.
- Commit연산이 실행되면 트랜잭션의 수행결과가 데이터베이스에 반영되어 데이터베이스의 일관된 상태를 유지 할 수 있다.
- Rollback연산이 실행되면 트랜잭션이 지금까지 실행한 연산의 결과가 전부 취소되며 트랜잭션 실행 전의 상태로 돌아간다.
트랜잭션의 성질 (ACID)
- 원자성 Atomicity : 트랜잭션 내의 모든 연산은 완벽하게 끝마쳐야 하며, 완벽하게 수행되지 않고 오류가 발생한다면 트랜잭션 전부가 취소되어야 한다.
- 일관성 Consistency: 트랜잭션을 완료하면 전과 비교했을 때 일관성 있는 데이터베이스 상태여야 한다.
- 독립성 Isolation: 둘 이상의 트랜잭션 병행시에 하나의 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 없다.
- 지속성 Durability: 트랜잭션이 완료되면, 그 결과는 영구적으로 반영되야 한다.
트랜잭션 관리를 위한 DBMS의 전략
DBMS는 보통 디스크에 데이터베이스를 저장하며, 전체 데이터베이스의 일부분을 메인메모리에 올린다. DBMS는 데이터를 고정 길이의 page로 저장하고 디스크에서 읽거나 쓸때에 page단위로 입출력이 이뤄진다. 메인메모리에 유지하는 페이지들을 관리하는 모듈을 버퍼관리자 라고 하는데, 이는 DBMS의 중요한 모듈중 하나이다. DBMS는 각 제품마다 구조가 다르긴 하지만 밑의 그림과 같이 크게 질의처리기, 저장시스템으로 나눠볼 수 있다.
버퍼관리자는 트랜잭션 관리에 매우 중요한 결정을 가져온다. 버퍼관리정책에 따라서 트랜잭션의 UNDO복구와 REDO복구가 요구되거나 그렇지 않게 된다.
UNDO
버퍼교체는 트랜잭션과는 무관하게 버퍼의 상태에 따라서 결정된다. 이로인해서 정상적으로 종료되지 않은 트랜잭션이 변경한 page는 원상복구해야 한다. 이때 원상복구하는 것을 UNDO라고 한다. 수정된 page를 디스크에 쓰는 시점을 기준으로 두가지 정책으로 나뉜다.
- STEAL: 수정된 page를 언제든지 디스크에 쓸 수 있는 정책(대부분의 DBMS)
- ¬STEAL: 수정된 page를 최소한 트랜잭션 종료시점까지는 버퍼에 유지하는 정책
REDO
이미 commit한 트랜잭션의 수정을 재반영하는 복구작업이다. REDO복구도 마찬가지로 버퍼관리정책에 영향을 받는다. 트랜잭션이 종료되는 시점에 해당 트랜잭션이 수정한 page를 디스크에도 쓸것인가 여부로 두가지 정책으로 나뉜다.
- FORCE: 수정했던 모든 page를 트랜잭션 commit시점에 디스크에 반영하는 정책
- ¬FORCE: 수정했던 page를 트랜잭션 commit시점에 디스크에 반영하지 않는 정책(대부분의 DBMS)
¬FORCE의 경우에 트랜잭션이 디스크상의 DB에 반영되지 않을 수 있기 때문에 REDO복구가 필요하다. 정리하자면, DBMS는 버퍼관리정책으로 STEAL과 ¬FORCE정책을 채택하고 있어서 UNDO복구와 REDO복구가 모두 필요하게 된다.
트랜잭션 관리
UNDO복구와 REDO복구를 위해 가장 널리 쓰이는 구조는 로그(log)이다.
로그는 데이터베이스의 모든 갱신작업을 기록한다. 로그는 이론적으로 어떠한 데이터손실도 발생하지 않는 안정적 저장매체에 속한다고 하는데, 사실 RAID와 같은 인프라시스템의 도움외에 DBMS자체적으로 여러개의 로그를 유지하는 식으로 안정적 저장매체처럼 동작하게 하는 기법을 사용한다. 하지만 대부분의 DBMS가 성능상의 이유로 하나의 로그를 사용한다고 한다.
Reference https://d2.naver.com/helloworld/407507
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 데이터베이스 정규화 개념정리 (0) | 2022.04.30 |
---|
댓글