본문 바로가기

학교공부/데이터베이스

9장

동시성 제어와 회복을 지원하기위해 트랜잭션 제공한다.

 

 

트랜잭션 예시

만약에 320명 갱신하다가 컴퓨터 꺼지면 어떻게하나?

log(로그) 유지해서 튜플들 수정한 기록 남겨논다.

 

 

 

 

위에 경우는 둘중 하나만 돼서는 안된다. 둘다되거나 아니면 둘다 안되거나해야됨

즉 하나의 트랜잭션(단위)처럼 DBMS가 보장해야한다.

 

 

 

 

 

컴퓨터는 뭐가 트랜잭션인지 모르니까 저렇게 범위를 사람이 지정해줘야한다.

commit하고 예약완료 메세지 보내야한다.

 

 

 

트랜잭션의 특성 4가지

1. 원자성

2. 일관성

디비는 일관성 - 일시적 비일관성 - 또다른 일관성

 

 

3. 고립성

 

 

 

 

4.  지속성

 

 

 

관계

 

 

 

완료와 철회

 

 

9.2 동시성 제어

여러 사람들이 동시에 테이블 접근해서 트랜잭션 사용하니까 트랜젝션 잘 관리해야한다. 

 

 

 

 

 

 

 

 

동시성 제어 안할시 생길수 있는 문제들 

 

 

 

 

 

 

 

 

 

 

아까 9.1절의 항공기 예약 상황을보면 이렇게 문제가 생길수도잇음(한좌석을 두명한테 배정)

 

 

트랜잭션 = 여러개의 연산

스케쥴 = 트랜잭션 수행 순서

 ex)

T1 : O11, O12, O13

T2 : O21, O22, O23, O24

T3 : O31, O32

 

S1 : T1, T2, T3 S2: T2, T1, T3

트랜잭션이 n개 있으면 직렬 스케줄은 n!개 존재가능

비직렬이면 오퍼레이션 개수만큼 팩토리얼 위에서는 9! / 3! 4! 2! (트랜잭션의 순서는 지켜야됨)

 

직렬스케줄과 결과가 동등한 비직렬 스케쥴을 시리얼하다고한다.(직렬가능) 결과만 같은게아니라 연산순서가 같아야됨 

 

그니까 직렬보다는 비직렬이 좋은데 그럼 여러가지 문제생긴다 따라서 로킹 등의 방법으로 직렬가능한 비직렬 스케쥴을 만들어 주는게 best임

 

 

 

위의 문제를 해결하기 위한 방법

로킹

 

 

 

 

 

 

 

 

로크를 일찍해제하면 직렬 스케줄이랑 결과값이 차이가 난다. 

 

 

 

직렬 가능이 항상 보장되지 않으니 2단계 프로토콜로 해결

 

 

 

 

 

 

 

다중 단위 로크 예시

T1 과 T2가 위 상황인 경우 만약 로크 단위가 튜플인경우 각 튜플에 로크 걸고 두개의 트랜잭션이 동시에 수행가능

하지만 block단위라면 한 트랙잭션만 사용가능

 

 

 

 

팬텀 문제

 

정리

 

로킹

-로크

-공유모드(읽기) vs 독점 모드(쓰기)

 

2단계 로킹 프로토콜

- 확장 단계(로크 요청)

- 수축 단계 (로크 해제) 모든 로크가 요청되고 수축함

- 로크 포인트 : 모든 로크가 요청된 시점

 

데드락

데드락 발생했는지 어캐아냐? -> 로크 요청 그래프

노드: 트랙잭션, 로크 (데이터항목)

만약 이 그래프에서 cycle이 존재하면 데드락 발생할수있음.

해결 방법 : cycle에 포함된 트랜잭션들 중에 하나를 철회하면 돌아갈거임

보통 방금 시작된 트랜잭션을 철회하는게 좋다. 왜냐하면 방금시작됐으니까 별로 뭐 바뀐거없을거고 철회했을때 비용이 젤 적다.  

 

다중로크

일반적으로는 튜플 단위인데 그 이상으로도 가능

 

 

 

 

9.3 회복

뭐 중간에 고장나거나 하면 회복이 필요함

redo는 재실행 undo는 취소.

start commit 둘다있으면 redo한다.

start만 있으면 즉시갱신은 undo(취소) 지연갱신은 그냥 폐기

 

재해적 고장말고는 보통 로그를 기반으로한 즉시 갱신 사용

 

 

 

 

 

 

 

예시

 

 

 

 

 

로그버퍼 -> 실제 log

db버퍼 ->실제 db

이때 로그 버퍼에 있는걸 먼저써야된다.

 

 

로그 버퍼와 db버퍼를 어떻게 관리할까?

로그버퍼는 ring buffer 형태로 관리한다.

근데 로그들을 다가지고 있으면 buffer overhead가 크다.

따라서 마지막 갱신 연산에 대한 LSN만 가지고 있는다.

만약에 221번째 명령을 수행한다고하자

로그버퍼의 LSN이 17번째이고 db버퍼의 LSN이 10번째이면 10번까지만 undo한다음에 작업하면 된다.

 

 

 

 

 

commit있는거 redo인데 0 1 3은 체크포인트 있으니까 무시하고 4 5 만 redo 2 6 은 start만 있으니까 undo

 

 

 

9.4절

 

 

 

 

 

고립 수준 낮으면 동시성 높아짐 하지만 데이터의 정확성은 떨어짐.

고리 수준 높으면 데이터가 정확해지지만 동시성이 저하됨.

 

 

serializable이 가장 좋아보이지만 고립수준이 높아서 성능은 별로 안좋음.

serializable이 어떻게 팬덤문제를 해결하나? next key value locking : 다음  locking하는 key를보고 

읽어야되는거 사이에 다 gap lock을 걸어버리면 insert못함

팬텀 해결완료~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'학교공부 > 데이터베이스' 카테고리의 다른 글

8장  (0) 2020.11.30
7장  (0) 2020.11.20
6장  (0) 2020.11.17
데이터베이스 4 -5  (0) 2020.10.21
실습 모음  (0) 2020.10.21