(MongoDB) 읽기 격리성, 일관성, 그리고 최신성
1. 트랜잭션이 보장해야 하는 ACID
- 원자성(Atomicity) : 한 트랜잭션 내에서 실행한 작업들은 모두 하나의 작업으로 간주한다. 모두 성공 또는 모두 실패되어야한다.
- 일관성(Consistency) : 모든 트랜잭션은 일관성있는 데이터베이스 상태를 유지해야 한다. DB에서 정한 무결성 조건을 항상 만족
- 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야 한다.
- 지속성 (Durability) : 트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.
격리성에 대한 이슈가 존재한다.
격리성을 완전히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생한다. 반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬처리하게 되면 데이터의 무결성이 깨질 수 있다.
* Serializable Isolation Level 이란?
- SELECT 수행시 READ LOCK ,즉 sharded lock을 사용
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 sharded lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.
* 몽고DB의 격리성
Read Uncommitted
몽고디비에서는 클라이언트가 끝나지 않는 쓰기 작업(durable) 에 접근할 수 있다.
Read Uncommitted는 디폴트 설정으로 mongod인스턴스와 레플리카셋 샤드 클러스터에 적용할 수 있다.
Read Uncommitted And Single Document Atomicity
single 쓰기 수행작업이 단건이 아닌 여러개의 documents를 수정할 때,
각각의 document에는 원자성(atomic)이 보장된다. 그러나 그 수행작업 전체에는 원자성이 보장되지 않고, 다른 수행작업이 간섭할 수 있다.
그래서 다음과 같은 특징을 가진다.
1.
2. Non-Serializable opration.
도큐먼트 d1에 대해 t1타임에 읽기 작업이 수행될 때, 얼마 후 도큐먼트 d1에 t2타임에 쓰기 작업이 수행되면 이떄에는 그 operations은 serialized를 보장된다.
읽기 수행작업이 쓰기 작업 수행보다 먼저 수행되기 때문이다.
반대의 케이스는 쓰기 작업 수행이 serializable schedule에 들어가 있어야만 보장된다.
3. 읽기 수행은 잘못된 document를 읽어올 수 있다. 읽기 작업보다 쓰기 작업이 먼저 수행되는동안 동시에 읽기 작업이 수행된다면 말이다.
좋은 문서 : https://stackoverflow.com/questions/17456671/to-what-level-does-mongodb-lock-on-writes-or-what-does-it-mean-by-per-connec
댓글
댓글 쓰기