*애트리뷰트가 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