트랙잭션이란?
데이터 베이스의 상태를 변화시키기 위해 수행하는 하나의 논리적 작업단위를 구성하는 일련의 연산들의 집합
ex) 한계좌에서 10만원을 인출하여 다른계좌로 10만원 입금하는 경우 전체작업이 정상적으로 완료되거나, 만약 정상적으로 처리될 수 없는 경우에는 아무것도 실행되지 않은 처음 상태로 되돌려뎌야한다.
트랜잭션의 성질
- 원자성: 트랜잭션의 모든 연산들이 정상적으로 수행완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야한다.(더이상 쪼갤 수 없다.)
- 일관성: 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야한다.
- 독립성: 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션에 끼어들 수 없다.
- 지속성: 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.
commit
하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산
Rollback
하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우
트랜잭션은 세가지 중 하나의 형태로 종료된다.
- 문제 없이 정상적으로 수행되는 경우에는 커밋을 통해서 종료되는 경우
- 잘못된 입력이 주어졌거나 일관성 제약 조건을 위해한다거나 하는 상황이 발생되거나 사용자의 요청에 의하여 철회되는 경우
- 타임아웃이나 교착 상태 등과 같이 시스템이 감지하는 문제로 인하여 DBMS가 철회하는 경우
이 외에도 트랜잭션은 각종 시스템 고장으로 인하여 영향을 받을 수 있으며, DBMS는 이와 같은 상황에서 트랜잭션을 관리해야한다.
DBMS의 구조
크게 질의 처리기, 저장시스템으로 나뉘며 비휘발성 저장 장치인 disk에 고정길이의 page단위로 저장하며 일부분을 Main Memory에 저장한다.
메인 메모리에 유지하는 페이지들을 관리하는 모듈을 보통 페이지 버퍼관리자 또는 버퍼 관리자라고 부르는데 DBMS의 많은 주요 모듈 중의 하나이다.
버퍼 관리 정책에 따라 UNDO복구와 REDO복구가 요구되거나 그렇지 않게 되는 등 트랜잭션 관리에 매우 중요한 결정을 가져오기 때문에 버퍼 관리자는 매우 중요하다.
UNDO
UNDO가 필요한 이유 : 수정된 Page들이 Buffer 교체 알고리즘에 따라서 디스크에 출력될 수 있음. Buffer 교체는 transaction과는 무관하게 buffer의 상태에 따라서, 결정됨. 이로 인해, 정상적으로 종료되지 않은 transaction이 변경한 page들은 원상 복구 되어야 하는데, 이 복구를 undo라고 함.
2개의 정책 (수정된 페이지를 디스크에 쓰는 시점으로 분류)
- steal : 수정된 페이지를 언제든지 디스크에 쓸 수 있는 정책
- 대부분의 DBMS가 채택하는 Buffer 관리 정책
UNDO logging과 복구를 필요로 함.
- 대부분의 DBMS가 채택하는 Buffer 관리 정책
- ¬steal : 수정된 페이지들을 EOT (End Of Transaction)까지는 버퍼에 유지하는 정책
- UNDO 작업이 필요하지 않지만, 매우 큰 메모리 버퍼가 필요함.
REDO
이미 commit한 transaction의 수정을 재반영하는 복구 작업
Buffer 관리 정책에 영향을 받음
Transaction이 종료되는 시점에 해당 transaction이 수정한 page를 디스크에 쓸 것인가 아닌가로 기준.
- FORCE : 수정했던 모든 페이지를 Transaction commit 시점에 disk에 반영
- transaction이 commit 되었을 때 수정된 페이지들이 disk 상에 반영되므로 redo 필요 없음.
- ¬FORCE : commit 시점에 반영하지 않는 정책
- transaction이 disk 상의 db에 반영되지 않을 수 있기에 redo 복구가 필요. (대부분의 DBMS 정책)
'백엔드(Back End) > DataBase' 카테고리의 다른 글
[TIL]20230801 - DB 인덱스 (0) | 2023.08.02 |
---|---|
[TIL]20230731 - DB 정규화 (0) | 2023.07.31 |
SQL(4)-COALESCE함수에 대해 정확히 알아보기 (0) | 2023.06.06 |
SQL(3)-JOIN (0) | 2023.06.02 |
SQL(2)-GROUP BY, ORDER BY (0) | 2023.06.01 |