ACID는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)를 의미한다.
이 4가지는 트랜젝션에서 안정성을 보장하는 4가지 원칙이다.
오늘은 이 원칙들에 대해서 Applicaiton과 DB 관점에서 책임의 분리에 대해서 학습해 보았다.
원자성(Atomicity)
원자성은 모든 쓰기 작업들이 하나의 트랜젝션에 묶여 모두 동작하거나, 모두 동작하지 않는 것을 의미한다. 트랜잭션에 문제가 생겨 실행이 되지 않는 것을 abort라고 하고, 트랜잭션이 완료되면 commit이라고 한다. abort가 된다면 트랜잭션이 일어나기 전 환경으로 되돌아 가고 이를 rollback이라 한다.
abort는 취지는 기본적으로 원 상태로 되 돌아가는 기능보다는, 트랜잭션을 안전하게 재시작 시킬 수 있다는 관점에서 의미를 가진다. 하지만
- 트랜잭션은 성공했지만 네트워크 문제로 commit이 실패할 경우 트랜잭션을 재 시작한다면 네트워크가 안정화 되었을때 2번의 트랜잭션이 commit 된다.
- 트랜잭션 과정에서 사용자에게 알림을 email로 보내야 하는 경우에 실패했다고 해서 abort라고 해서 보낸 email이 rollback 되지는 않는다. 따라서 트랜잭션을 재시작 하면 email을 또 다시 보내게 된다.
등등의 이유들로 현대의 프레임워크들은 abort된 트랜잭션을 재시작 하지 않는다. 트랜잭션을 재시작 하는 것은 애플리케이션에게 책임을 위임하고 DB는 트랜잭션이 올바르게 실행되지 않았다면 abort와 rollback의 책임만 가지게 된다.
일관성(Consistency)
트랜잭션에서 일관성이라 하면 대부분 '트랜잭션 전 후에 "DB의 상태"가 일정하게 유지 되어야 한다'라고 알고 있으며 "DB의 상태"라는 말에 제약조건 정도만 생각하기 마련이다. 하지만 일관성에서 말하는 "DB의 상태"는 DB가 관리하는 제약조건을 넘어 데이터에 관한 불변식(invariant)이 지켜져야 한다는 말이다. 예시를 들어 age(나이) 라는 column이 있을 때 age의 최대 값은 200을 넘길 수 없다. 하지만 이러한 도메인적인 조건을 DB에서 통제 할 수 있는 수단이 없다. 따라서 일관성을 올바르게 유지하는 것은 DB의 책임이 아니라 애플리케이션의 책임이다.
격리성(Isolation)
격리성은 동시에 실행되는 트랜재션은 서로 격리된다는 것을 의미한다.
가장 높은 수준의 격리성은 직렬성 격리(Serializable Isolation)로 동시에 발생한 트랜잭션이 커밋될 때는 순차적으로 실행했을 때의 결과와 동일하게 보장하는 것이다. 하지만 이는 성능 손해를 유발함으로 현실에서는 완화된 격리 수준인 스냅샷 격리를 사용한다.
추가적인 정보는 https://snack-and-time.tistory.com/44이곳에서 확인 할 수 있다.
지속성(Durability)
지속성은 "트랜잭션에서 기록한 모든 데이터는 영구적으로 저장된다"이다. 여기서 "영구적으로 저장"은 하드웨어의 결함이 발생하거나 데이터베이스가 죽더라도 트랜잭션에서 쓰여진 모든 데이터는 손실되지 않아야 한다는 말이다. 따라서 지속성은 트랜잭션이 끝나고 DB에 저장되는 것을 넘어서 여러 단일 노드 데이터베이스에 복사 됐다는 것을 의미한다.
'computer science > DB' 카테고리의 다른 글
[데이터 중심 애플리케이션 설계] 7장. Write에서의 동시성 문제 (0) | 2024.07.14 |
---|---|
[데이터 중심 애플리케이션 설계] 7장. Isolation Level (0) | 2024.06.30 |
하나의 트랙잭션에서 insert 다음에 나오는 select 쿼리는 insert된 결과를 가지고 있을까? (0) | 2024.06.23 |
#1 Redis type (0) | 2024.03.04 |
DBCP(DB connection pool) (0) | 2023.11.04 |