데이터베이스하면 항상 따라다니는 기본 개념인 ACID에 대해 정리해본다.
트랜잭션은 DB 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용한다. 부정합이 발생하지 않으려면 프로세스를 병렬로 처리하지 않도록 하여 한 번에 하나의 프로세스만 처리하도록 하면 되는데, 이는 효율이 너무 떨어진다. 병렬로 처리할 수 밖에 없는 현실적인 상황으로 인해 부정합을 방지하고자 트랜잭션을 사용하는 것입니다. 자세한 내용은 https://hyeri0903.tistory.com/169?category=772718 에 정리해두었다.
ACID(원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 짐그레이즞 1970년대 말에 신뢰할 수 있는 트랜잭션 시스템의 이러한 특성들을 정의하였으며 자동으로 이들을 수행하는 기술을 개발해 냈다. (출처 : 위키백과)
ACID
- 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다.
- 일관성(Consistency): 트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
- 고립성(Isolation): 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경중인 데이터 값을 훼손하지 않아야한다.
- 지속성(Durability) : 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다.
최근까지 DB들은 대부분 ACID를 보장하기 위해 락(lock)에 의존했다. 이것은 데이터 처리전에 언제나 락이 필요함을 의미한다. 많은 수의 락을 관리하게 되면 동시작업 수행이 어렵고 성능저하를 초래하게 된다. A유저가 특정 테이블을 읽고 있다면 B유저는 A의 트랜잭션이 끝나기를 기다려야 한다. (락에대한 설명은 https://hyeri0903.tistory.com/176?category=772718 에 정리해두었다.)
락의 대안으로 수정되는 모든 데이터를 별도 복사본으로 관리하는 MVCC(Multiversion Concurrency Control , 다중 버전 동시성 제어)가 있다. 방금 전 언급한 A,B 유저의 예를 들면 A가 트랜잭션을 시작할 때 가지고 있던 복사본을 B에 제공하여 동시에 수행이 가능하다. (Snapshot 데이터 이용). 이 방식은 사용자들이 데이터 처리하는 데 있어 많은 유연성을 제공한다. MVCC 방식은 Snapshot을 이용하여 Locking을 필요하지않으므로 일반적인 RDBMS 보다 더 빠른 동작이 가능하다. 또한 데이터를 읽기 시작 할 때 그 데이터를 삭제, 수정하더라도 영향을 받지 않고 데이터를 사용할 수 있다.
네트워크 환경에서 ACID특성을 보장하는 것은 어렵다. 연결이 끊길 수도 있고 두 사용자가 동시에 DB의 동일한 부분을 접근할 수도 있다
트랜잭션의 commit 여부를 각 사용자로부터 확인하기 위해 2단계 commit이 분산 트랜잭션에 적용된다. 트랜잭션이 병렬 수행되는 경우 많은 주의가 필요하다. 2단계 락은 완전한 독립성을 보장하기 위해 사용된다.
참고:
https://victorydntmd.tistory.com/129
'스터디 > Database' 카테고리의 다른 글
[DB] MySQL CharacterSet과 Collation (0) | 2022.11.12 |
---|---|
[MySQL] 다중 테이블 업데이트, 여러 테이블 update 하기 (0) | 2022.10.06 |
[DB] 정규화 vs 반정규화(비정규화) (0) | 2021.07.04 |
[DB] Locking (잠금 기법) (0) | 2021.05.28 |
[DB] 데이터 정규화 1NF, 2NF, 3NF, BCNF (0) | 2021.05.28 |
댓글