DB Consistency 용어정리
5 min readFeb 3, 2022
ACID
Atomicity(원자성)
- 트랜잭션과 관련된 일련의 작업들이 한번에 반영
- 트랜잭션 단위의 모든 작업이 한번에 롤백
Consistency(일관성)
- 데이터가 미리 정의된 규칙에 의해서만 수정이 가능한 특성
- 예를들어 숫자 타입의 컬럼에 문자열값을 넣을 수 없도록 보장함
Isolation(독립성)
- 트랜잭션 수행 시, 다른 트랜잭션이 끼어들지 못하도록 보장
- 트랜잭션 밖의 어떤 연상도 중간 단계 데이터를 볼 수 없음
Durability(지속성)
- 성공적으로 수행된 트랜잭션이 영원히 반영되는 것을 보장
Isolation Level(트랜잭션 격리 수준)
동시에 여러 트랜잭션이 처리될때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것
READ UNCOMMITED
- 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 값을 읽을 수 있음
- Dirty Read, Dirty Write 현상이 발생할 수 있음
READ COMMITTED
- RDB에서 대부분 기본적으로 사용하고 있는 격리 수준
- 실제 테이블에서 값을 가져오지 않고, undo 영역에 있는 백업된 레코드에서 값을 가져옴
- 하나의 트랜잭션 내에서 읽은 값의 결과가 바뀔 수 있음
- Lost Update, Read Skew, Write Skew가 발생할 수 있음
REPEATABLE READ
- 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽음
- MVCC(Multi Version Concurrency Control) 변경 방식
- Phantom Read가 발생할 수 있음
Phantom Read: 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안보였다가 하는 현상
SERIALIZABLE
- 가장 단순한 격리 수준이지만, 가장 엄격한 격리 수준
- 동시 처리성능이 가장 떨어짐
- 성능이 너무 떨어져서 데이터베이스에서는 거의 사용되지 않음
Consistency Model
String Consistency
- 가장 엄격한 일관성으로 모든 읽기가 가장 최근에 기록된 값을 읽어야 함
- 기존 RDBMS에서 사용하는 방식
- 분산화된 상태에서는 일관성을 엄격하게 유지한다는 것이 매우 어려움
- 분산 시스템에서 적용하면 매우 느려짐
Sequential Consistency
- 모든 트랜잭션의 발행된 순서를 보장해줌으로써, 불일치 문제의 발생을 막음
- 어느 정도의 interleaving을 허용
- 커밋된 모든 작업이 동일한 순서로 나타나야 함
Causal Consistency
- 이벤트 순서에 일관성을 부여하여 관련성이 있는 모든 쓰기가 순서대로 읽히도록 함
- 분산 및 병렬 처리 환경에서 발생되는 일관성을 인과적인 관계로 구현한 기술
- Sequential Consistency와 다르게, 인과 관계 연산만 순서대로 나타남.
- Monotonic reads(MR): 일단 어떤 값을 읽으면, 모든 후속 읽기가 정확히 이값 또는 새로운값을 반환한다. 값을 읽은 다음에는 네트웍에 문제가 있어도, 일관성을 유지한다.
- Monotonic writes(MW): 모든 쓰기가 제출된 순서대로 표기된다. 시스템이 순서를 변경하지 않을 것을 보장한다.
- Read your writes(RYW): 값을 업데이트한 후, 클라이언트가 그 값을 읽을때 마다, 업데이트된 값을 반환한다.
- Pipelined Random Access Memory(PRAM): 단일 프로세스의 모든 작업이 파이프라인에 있는 것처럼 수행된 순서대로 다른 프로세스에서 볼 수 있도록 보장한다. MR + MW + RYW라고 볼 수 있다.
- Writes follow reads(WFR): 어떤 읽기 작업 이후에 쓰기 작업인 경우, 다른 클라이언트에서 해당 읽기 작업을 읽은 경우에만 쓰기 작업의 결과를 볼 수 있다.
Eventual Consistency
- 클라이언트가 변경된 데이터를 요청했을때, 일시적으로 클라이언트마다 다른 버전의 데이터를 받게 될수 있지만, 언젠가 동기화가 되면 최종적으로는 모든 클라이언트가 동일한 데이터를 받게되는 것
- 업데이트(쓰기)가 없으면, 모든 클라이언트는 일정 시간동안 정확히 동일한 상태를 읽을 수 있다.
- 따라서 새로운 쓰기 작업이 중단되면, 결과적으로 일관된 상태로 수렴한다.
- 이것은 구현하기 쉽고, 매우 좋은 성능을 제공하는 약한 제약조건으로 가용성이 높다.
Weak Consistency
- 데이터를 동기화 데이터와 비동기화 데이터로 나누어 다르게 처리한다.
- 동기화 데이터: 모든 시스템 전반에 걸쳐 동기화 되어야 한다. 이 경우 모든 영역에 값이 정확히 쓰여질 때까지 쓰기 연산은 완료된 상태로 보지 않는다.
- 비동기화 데이터: 일부의 데이터 영역만 저장되어도 쓰기 연산이 성공했다고 보도록 레벨을 설정할 수 있다. 레벨을 조정하여 일정 수준의 일관성을 확보하고, 비일관성이 발생하면 보정 기능을 통해서 해결한다.