ACID
December 11, 2020 · View on GitHub
Krzysztof Grzybek
-
원자성은 단일 트랜잭션의 쿼리가 실패 할 경우 전체 트랜잭션도 실패하고 데이터베이스가 변경되지 않은 상태로 유지되도록 지정합니다. "실패"란 애플리케이션 오류뿐만 아니라 정전과 같은 외부 요인도 의미합니다.
-
일관성은 각 트랜잭션이 하나의 유효한 상태에서 다른 유효한 상태로 데이터베이스를 유도해야 함을 지정합니다. 불변성을 유지해야합니다.
-
격리는 각 트랜잭션이 서로 격리되어 수행되어야 함을 지정합니다. 다양한 수준의 격리가 있습니다.
- "read uncommitted" - 격리 없음 - 다른 트랜잭션에서 커밋되지 않은 데이터를 읽을 수 있습니다.
- "read committed" - 더 나은 격리 - 다른 트랜잭션에서 커밋된 데이터 만 읽을 수 있습니다. 다른 트랜잭션 중에 동시 트랜잭션이 시작되었지만 더 일찍 완료된 경우 불일치가 발생합니다.
- "repeatable read" - 일반적으로 "충분히 좋은" 격리 - 트랜잭션의 각 쿼리는 트랜잭션 시작시 커밋된 업데이트만 확인합니다. Lock 또는 버전 관리로 구현 될 수 있습니다. 가상 읽기가 발생할 수 있습니다.
- "serializable" - 최고 수준의 격리 - 트랜잭션이 동시에 실행되지 않고 연속적으로 실행됩니다.
격리의 수준에 따라 성능이 저하됩니다. 이것이 "repeatable read"가 자주 사용되는 이유입니다. 또한, 제시된 모델은 db 엔진 구현에 따라 종종 더 복잡해집니다. 자세한 내용은 여기서 찾을 수 있습니다.
-
내구성은 트랜잭션이 커밋 된 후 정전이나 충돌 후에도 데이터가 유지되도록 지정합니다.