gyoogle.dev 블로그와 탕구리 블로그를 참고하여 작성하였습니다.
이미지를 누르면 이미지의 출처로 이동합니다.
트랜잭션
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업단위로 작업의 완전성을 보장해 주는 것
- 작업단위란 SQL명령문들을 사람이 정하는 기준에 따라 정해놓은 단위
- 논리적 작업셋을 완벽하게 처리하거나 그렇지못한경우 원 상태로 복구한다.
트랜잭션 특징(ACID)
-
원자성(Atomicity)
: 트랜잭션이 DB에 모두 반영되거나 전혀 반영되지 않아야한다.
-
일관성(Consistency)
: 트랜잭션의 작업처리 결과는 항상 일관성이 있어야 한다
-
독립성(Isolation)
: 둘 이상의 동시에 병행실행중일 때 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
-
지속성(Durability)
: 트랜잭션이 성공적으로 완료되었으면 결과는 영구반영되어야 한다.
Commit과 Rollback
1) Commit
- 하나의 트랜잭션 성공적으로 수행으로 마침
- DB의 일관된 상태 알려주는 연산
2) Rollback
- 하나의 트랜잭션 처리 비정상종료->원자성이 깨진 상태에 수행
- Last consistent state로 rollback가능
DBMS의 구조

- 크게 질의처리기, 저장시스템으로 나뉨
- 입출력 단위는 고정길이의 page단위
- 저장공간은 디스크에 저장하며 일부 Main Memory에 저장
page buffer
- 메인 메모리에 유지하는 페이지를 관리하는 모듈로 UNDO, REDO요구를 할 수 있다.
1)UNDO
- Buffer 교체는 트랜잭션과 무관하게 buffer의 상태에 따라 결정되므로 정상적으로 종료못한 트랜잭션의 결과를 원상복구시켜야 한다. 이 복구가 UNDO이다.
- 두가지 정책
- 수정된 페이지 언제든지 디스크에 쓸 수 있는 정책
- 수정된 페이지들을 최소한 트랜잭션 종료지점까지는 버퍼에 유지하는 정책
2)REDO
- 이미 커밋된 트랜잭션의 수정을 재반영하는 복구작업
- DBMS에서 이루어지는 작업은 REDO LOG에 기록되므로 이 내용을 기반으로 REDO 수행
- 두가지 정책
- 수정했던 모든 페이지를 트랜잭션 커밋 시점에 디스크에 반영
transaction이 commit 되었을 때 수정된 페이지들이 disk 상에 반영되므로 redo 필요 없음
- 수정했던 페이지 트랜잭션 커밋 시점에 디스크에 반영하지 않기
디스크에 수정한 페이지가 반영되지 않더라도 어떤 작업을 했는지 로그에 기록되므로 필요시 UNDO, REDO가능
트랜잭션 격리수준
- 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준
- 트랜잭션이 DB다루는 동안 다른 트랜잭션이 관여하지 못하도록 Locking을 통해 막아야한다.
- 무조건 Locking 통해 막으면 성능이 떨어지게 되지만 성능높이기 위해 Locking범위 줄이면 잘못처리될 문제 발생하게 된다.
- 최선의 Locking 방법을 찾아야한다.
격리 레벨 종류
1) 레벨 0(Read Uncommitted)
- SELECT 수행중에 Shared Lock 안걸림
- 처리중이거나 commit되지 않은 데이터 다른 트랜잭션이 읽는 것 허옹
- 일관성 유지 불가능
2) 레벨 1(Read Commited)
- SELECT 문장 수행중에 Shared Lock 걸림
- 트랜잭션 수행 중 다른 트랜잭션은 대기
- Commit 이루어진 트랜잭션만 조회가능
- SQL 서버의 Default 레벨
3) 레벨 2(Repeatable Read)
- 트랜잭션이 완료될 때까지 SELECT문장이 사용하는 모든 데이터에 Shared Lock걸림
- 트랜잭션이 범위 내에서 조회한 데이터 항상 동일
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능
- 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 커밋된 것만 보게 되는 것
4) 레벨 3(Serializable)
- 트랜잭션이 완료될 때까지 SELECT문장이 사용하는 모든 데이터에 Shared Lock걸림
- 완벽한 읽기 일관성 모드 제공
- 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정, 입력 불가능
발생가능한 문제점들
- Dirty Read: 커밋안된 수정중인 데이터 다른 트랜잭션에서 읽을 수 있도록 허용해서 발생
- Non-Repeatable Read: 한 트랜잭션에서 같은 쿼리 두번 수행할때 그 사이에 수정, 삭제하면서 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상
- Phantom Read: 한 트랜잭션 안에서 레코드 두번이상 읽었을때, 없던 쿼리가 나타나는 현상