*애트리뷰트가 Null 일경우

 

1. 적용x (적용할 수 x, 값 x)

2. 기록x (값 o, 지정x)

3. 알수x (값x or 적용할수x)

 


 

*키 -> 유일성, 최소성

 


* 트랜잭션(작업 수행의 논리적인 단위)

 

-> ACID

1. 원자성(Atomicitiy)

: 트랜잭션 변경 연산은 모두 성공적 수행 or 전혀 수행x

2. 일관성(Consistency)

:  트랜잭션 실행 후 db를 하나의 일관된 상태로 남겨두어야함

3. 격리성(isolation)

:  각각의 트랜잭션은 단독으로 실행된 것 같은 효과

4. 영속성(durability)

: 트랜잭션 성공 -> DB 변경 영구적이어야함

 


* 원자성을 지원하기 위한 연산

-> 완료(Commit), 복귀(Rollback)

 

*격리되지 않은 트랜잭션의 문제점

-> 오손 판독(dirty read), 갱신 분실(lost update), 반복 불가능(unrepeatable read)한 읽기, 팬텀(나중에 없어짐)

 

* 직렬 가능(serializable) (트랜잭션 격리 레벨 중 가장 엄격)

-> 오손판독, 반복불가능 읽기, 팬텀 문제 모두 예방

-> 단점 : 동시성이 떨어진다! -> 실행할 수 있는데 멈춰야하기 때문! -> 동시성을 위해선 isolation 약하게 해야함 !!

-> 동시성 전혀없어서 비현실적 !

 

* 직렬가능 스케줄을 보장 : 2단계 로킹(2PL:two-phase locking)

-> 읽기 로크(read lock) : 읽을수 o, 변경할 수 x

-> 쓰기 로크(write lock) : 읽을수x, 쓸 수 x

 

-> 로크 단위 작아질수록 : 병행성 증가, 오버헤드 증가

-> 로크 단위 커질수록 : 병행성 감소, 유지 로크 수 감소, 로크 걸고 해제하는데 걸리는 시간 감소

 

*2단계 로킹 프로토콜

-> 확장 단계(growing phase) : lock만 가능

-> 축소 단계(shrinking phase) : unlock만 가능 -> 어떤 로크 해제되면 그 트랜잭션은 새로운 로크 요청 할 수 x !!!!

 

*보수적 2단계 로킹(Conservatinve 2PL) : 시작초기에 모든 로크 얻음

-> 장점 : 트랜잭션이 충돌 or 교착상태 전혀 x

-> 단점 : 사용가능한 모든 객체에 로크 -> 병행성이 제한됨!

*엄격한 2단계 로킹(Strict 2PL) : 마지막에 해제! (전체 실행 동안 확장단계)

-> 장점 : 각 트랜잭션이 필요로 하는 것에만 로크설정(하나만 확보해도 진행가능)

-> 단점 : 교착상태가 일어날 가능성O

 

 


 

+ Recent posts