반응형
데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질들이 있는데,
이것들의 약어가 ACID 입니다.
Atomicity 원자성
처리중간에 중단되지 않는 것을 보장함.
예를들어, 포인트로 구매한다고 했을 때
먼저 포인트 차감 업데이트 후 구매 완료 업데이트를 해야하는데,
포인트 차감 후에 오류가 발생해서, 구매 완료는 되지 않고 포인트만 차감된 경우가 생길 수 있죠.
이런 경우가 생기지 않도록 보장하는 성질이 원자성입니다.
Consistency 일관성
트랜잭션이 성공적으로 끝나면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것.
Isolation 독립성
트랜을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장.
계좌에 100만원이 있는데, 두개의 디바이스에서 같은 계좌에 동시에 출금을 하게될 때,
폰1 : 잔고 확인 -> 100만원 있음 -----> 출금 요청 -> 100만원 출금
폰2 : 잔고 확인 -----> 100만원 있음 --> 출금요청 -> 100만원 출금
이렇게 되지 않도록, 먼저요청한 폰1에서 출금요청이 완료될때 까지 다른 요청이 관여할 수 없게 한다는 것.
Durability 지속성
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함.
(참고)
Lock
ACID를 보장하기 위해 락(lock)을 사용하는 경우가 많습니다.
lock은 위의 isolation 예시에서 폰1의 출금요청이 시작되고 완료될때까지 해당 table 에 다른 작업을 못하도록 하는 것입니다.
하지만, 이것도 단점이 있죠. 수많은 사용자들이 있다면, 동 시간에 출금 요청이 몰리면 계속 기다리는 현상이 있을 수 있습니다.
그래서 이런 lock 에 대안으로 모든 데이터를 복사본으로 관리하는 MVCC(다중 버전 동시성 제어)가 있습니다.
MVCC
MVCC 데이터베이스가 데이터의 업데이트가 필요할 때, 기존 데이터 항목을 새로운 데이터가 덮어쓰는 대신 데이터 항목의 새로운 버전을 만든다. 즉, 여러 버전이 저장된다. 각 트랜잭션이 주시하는 버전은 구현된 격리 레벨에 따른다. MVCC로 구현된 가장 흔한 격리 레벨은 스냅샷 격리이다. 스냅샷 격리를 사용하는 경우 트랜잭션은 트랜잭션이 시작할 당시처럼 데이터의 상태를 관찰한다.
MVCC는 포인트-인-타임 일관성(point-in-time consistent) 뷰를 제공한다. MVCC 상태에서 읽기 트랜잭션은 일반적으로 타임스탬프나 트랜잭션 ID를 사용하여 읽을 DB의 상태를 결정하고 데이터의 버전들을 읽는다. 그러므로 읽기, 쓰기 트랜잭션은 락(lock)의 필요 없이 다른 트랜잭션과 격리된다. 그러나 락이 불필요함에도 불구하고 오라클 등 일부 MVCC 데이터베이스에서는 락이 사용된다. 쓰기는 더 새로운 버전을 만드는 반면, 동시성 읽기는 더 오래된 버전에 접근한다.
728x90
반응형
'DB,서버,OS 등' 카테고리의 다른 글
[Anaconda] Python 가상환경 생성하기 (0) | 2022.09.29 |
---|---|
[Anaconda] Centos 에서 가상환경 써보기 (0) | 2022.09.28 |
[linux] Bash Script 로 hosts 등록하기 (0) | 2021.09.06 |
[MySQL] Safe mode 해제 하는 방법 (0) | 2021.01.09 |
[Markdown] md 아이콘 사용하기 #markdown icon (0) | 2021.01.09 |
댓글