데이터베이스가 언제나 유효하고 올바른 상태로 유지되는 것을 보장하는 성질이다. 이는 트랜잭셔닝 성공적으로 완료된 후에도 데이터베이스가 미리 정해진 규칙이나 제약 조건을 위반하지 않는 상태를 의미한다.
여기에서는 데이터의 일관성과 읽기 작업의 일관성이라는 두 가지 측면에서 설명하다.
1. 데이터의 일관성 (Consistency in Data)
데이터의 일관성은 데이터베이스 내의 데이터가 사용자가 정의한 규칙에 따라 항상 올바른 값을 갖는 것을 의미한다.
- 정의 주체: 데이터의 일관성은 개발자나 사용자가 정의한 비즈니스 규칙에 의해 결정된다.
- 보장 수단: 다음과 같은 데이터베이스 기능들을 통해 보장된다.
- 참조 무결성 (Referential Integerity): 한 테이블의 값이 다른 테이블의 값과 반드시 연결되도록 강제하는 외래 키(Foreign key) 제약 조건 등이 대표적이다.
- 원자성 (Atomicity): 트랜잭션이 완전히 성공하거나 실패하도록 하여 어중간한 상태의 데이터가 남지 않도록 한다.
- 고립성 (Isolation): 여러 트랜잭션이 동시에 실행될 때 서로에게 부적절한 영향을 주지 않도록 격리한다.
- 일관성이 깨진 예시:
Pictures 테이블에는 ID가 1, 2인 사진만 있는데, Picture_Likes 테이블에는 존재하지 않는 4번 사진에 대한 '좋아요' 기록이 있는 경우가 있다. 이는 참조 무결성이 깨진 상태로, 데이터의 일관성이 훼손된 것이다.
2. 읽기 작업의 일관성 (Consistency in Reads)
시스템 전체의 관점에서 데이터 변경 사항이 사용자에게 언제, 어떻게 보이는지에 대한 문제이다.
- "하나의 트랜잭션이 데이터를 변경하고 커밋했을 때, 다른 새로운 트랜잭션이 그 변경 사항을 즉시 볼 수 있는가?"에 대한 문제이다.
- 결과적 일관성 (Eventual Consistency): 분산 데이터베이스나 NoSQL 시스템에서는 성능과 가용성을 위해 데이터를 여러 곳에 복제하는 경우가 많다. 이때 한 곳에서 데이터가 변경되면 다른 복제본으로 전파되는데 약간의 시간이 걸릴 수 있다. 이처럼 언제가는 데이터가 일관된 상태에 도달하지만, 일시적으로는 불일치 상태를 허용하는 것을 '결과적 일관성'이라 한다.
- 발생 환경: 이러한 읽기 일관성 문제는 관계형 데이터베이스와 NoSQL 데이터베이스 모두에서 발생할 수 있다.