07. 업데이트, 원자적 연산, 삭제
주요 내용
- 도큐먼트 업데이트
 - 도큐먼트 원자적 프로세싱
 
도큐먼트 업데이트#
전체 대치#
- 도큐먼트 전체가 doc으로 대치되므로 주의
 
특정 필드 수정#
전체 대치 vs 특정 필드 수정#
- 리뷰수 증가 예제
 
- 대치는 일반적이고, 쉽다
 - 특정 필드 수정은 좀 더 나은 성능을 가짐
- 도큐먼트를 원자적으로 업데이트하는 데 적합
 - optimistic locking 을 제공
- 레코드를 잠그지 않고 업데이트 연산이 제대로 수행되는 것을 보장하기 위한 기술
 
 
 
도큐먼트 원자적 프로세싱#
- 원자적 업데이트는 다른 연산이 끼어들 수 없는 업데이트
 - MongoDB의 모든 업데이트는 원자적 업데이트
 findAndModify: 도큐먼트를 업데이트한 후 업데이트 된 도큐먼트를 반환- 다른 수정 연산 전에 조회로 결과를 받아옴
 - job queue와 state machine 을 만들 수 있음 (transaction 같이 구현 가능)
 
동시성, 원자성, 고립#
- 3.0 WiredTigher 엔진에서는 컬렉션 레벨에서 하나의 쓰기 여러개 읽기를 제공
- 도큐먼트 수준의 잠금을 제공
 
 - 잠금기능이 제공해주는 최적화
- 램에 있는 doc의 내부맵을 DB가 유지 (doc이 램에 없으면 페이징 될때까지 다른 연산 수행)
 - 쓰기 잠금 양보 (잠시 잠금을 해제했다가 다른 읽기 쓰기에 양보)
 
 - 잠금기능을 무효화하기 위해 
$isolated옵션 사용 가능- 해당 연산 실패 시 암시적 롤백이 발생하지 않음
 - 샤드된 컬렉션에서 동작하지 않음
 
 
업데이트 성능#
MMAPv1 에 적용되는 이야기
$inc와 같은 연산은 대상 필드의 타입이 지정된 사이즈 (int, double 등) 이기 때문에 bson 크기 변하지않아 성능에 좋음$push는 주의해서 사용하며, 업데이트는 doc을 최대한 작게 유지- padding factor
- doc 사이즈가 늘어날 것을 대비해 디스크 사이즈를 확보하는 지수
 - 지정된 패딩 사이즈를 넘어갈 경우 패딩 팩터를 곱해 storage size를 확보함