데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위이다.
상태를 변화시킨다는 것 → SQL 질의어를 통해 DB에 접근하는 것
작업 단위 → 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것
예시) 사용자 A가 사용자 B에게 만원을 송금한다.
*이때 DB 작업
현재 작업 단위 : 출금 UPDATE문 + 입금 UPDATE문
→ 이를 통틀어 하나의 트랜잭션이라고 한다.
Commit
Rollback
- Commit
하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산- Rollback
하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우
transaction이 정상적으로 종료되지 않았을 때, last consistent state (예) Transaction의 시작 상태) 로 roll back 할 수 있음.
즉, 하나의 트랜잭션 설계를 잘 만드는 것이 데이터를 다룰 때 많은 이점을 가져다준다.
트랜잭션의 특징은 대표적으로 4가지(ACID)가 있다.
- 원자성(Atomicity)
트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.
- 일관성Consistency)
트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.
- 독립성(Isolation)
둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
- 지속성(Durability)
트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.
이해를 위한 2가지 개념 : DBMS의 구조 / Buffer 관리 정책
1. DBMS의 구조
크게 2가지 : Query Processor (질의 처리기), Storage System (저장 시스템)
입출력 단위 : 고정 길이의 page 단위로 disk에 읽거나 쓴다.
저장 공간 : 비휘발성 저장 장치인 disk에 저장, 일부분을 Main Memory에 저장
Buffer 관리 정책에 따라, UNDO 복구와 REDO 복구가 요구되거나 그렇지 않게 되므로, 트랜잭션(transaction) 관리에 매우 중요한 결정을 가져온다.
즉, UNDO는 작업 롤백과 읽기 일관성, 복구를 한다.
2개의 정책 (수정된 페이지를 디스크에 쓰는 시점으로 분류)
steal : 수정된 페이지를 언제든지 디스크에 쓸 수 있는 정책, EOT (End Of Transaction)까지는 버퍼에 유지하는 정책
즉, 기본적으로 복구의 역할을 하며 DB서버에 무슨 작업을 하든 모두 REDO에 기록이 된다.
트랜잭션이 종료되는 시점에 해당 트랜잭션이 수정한 page를 디스크에 쓸 것인가에 대한 판단으로 기준
FORCE : 수정했던 모든 페이지를 Transaction commit 시점에 disk에 반영, commit 시점에 반영하지 않는 정책
transaction이 commit 되었을 때 수정된 페이지들이 disk 상에 반영되므로 redo 필요 없음.
transaction이 disk 상의 db에 반영되지 않을 수 있기에 redo 복구가 필요. (대부분의 DBMS 정책)
References (참고 자료)