1. MVCC (Multi Version Concurrency Control)
DBMS에서 Lock을 사용하지 않고, 데이터의 일기 일관성을 보장해 주는 내부 기법. (Lock은 서버의 동시성을 크게 떨어트린다. )
객체의 변경사항을 모두 버전을 나누어 저장하고, 데이터 객체는 이 버전을 모두 연속체로서 정의, 관리하게 하여 락을 사용하지 않고 일관된 읽기를 보장.
1.1. MGA - Multi Generation Architecture (PostgreSQL)
데이터를 변경할때 해당 데이터를 변경하는것이 아닌, 새로운 데이터를 추가 후 새로운 데이터를 링크를 연결하는 방식
1.2 Undo 방식 (Oracle, mysql/innodb)
Undo 영역을 따로 두고 최신 데이터는 데이터 영역에 두고, 올드 데이터는 언두 영역에 두어 레코드 갱신에 대한 버전 관리하는 방식.
만약 변경 작업이 완로되지 않은 상태(트랜잭션 락이 걸림)에서 다른 세션이 같은 영역을 읽기 작업을 한다면, 레코드의 SCN(레코드id+접근시간) 정보를 확인하여 언두 영역을 찾아서 데이터를 로드한다.
2. 트랜잭션 처리를 위한 ID 발급
2.1 오라클
오라클에서는 트랜잭션 처리를 위해 공간 정보인 XID와 시간 정보인 SCN으로 MVCC를 구현한다.
1. 트랜잭션이 시작될때 공간 정보 XID 할당 (XID : Undo의 위치 정보)
2. 트랜잭션이 커밋되면 SCN 할당 (system change number)
2. 2 postgreSQL
1. 트랜잭션이 실행시 따라 증가하는 시간정보인 XID값을 insert시에 헤더의 t_xmin에 저장, delete시에는 t_xmax에 저장
2. SCN는 따로 할당 받지 않고, t_ctid를 통해 MVCC를 구현
3. 테이터 블록 내의 레코드 관리
기본 단위를 블록 Or 페이지라 하며, 스토리지와 머모리 버퍼간의 select / write 시 블록 단위로 I/O하게 된다.
- Oracle/postgreSQL은 새로운 레코드를 insert하면 데이터 페이지 내 아래쪽에서 부터 차례로 저장하고, 헤더는 이 레코드를 가리키는 포인터가 차례로 생긴다.
- mysql은 새로운 레코드가 Insert되면 페이지의 위쪽부터 데이터 레코드가 저장되고, 아래쪽부터 레코드의 슬롯정보가 생긴기는데, 레코드의 정보가 아닌 탐색을 위한 장치이다.
4. 트랜잭션의 commit 처리
4. 1 postgreSQL
- 트랜잭션이 commit되면 튜플 헤더의 t_infomask 컬럼을 commit, abort 등 트랜잭션 상태값을 변경한다.
4. 2 Mysql
트랜잭션이 commit되면
1. 해당 트랜잭션의 언두 블록에 commit시점의 MAX_TRX_ID를 언두 블록의 TRX_NO 컬럼에 저장
2. 롤백 시스토리의 리스트에서 commit 언두 블록 등록
3. trx_sys에서 tax_structure를 리스트에서 제외시켜 active trx 리스트를 갱신
5. Old version의 정리
5. 1 Oracle/Mysql
트랜잭션의 MVCC를 구현하기 위해 언두에 old version을 저장해둔다. 그리고 commit이 완료된 언두는 purge 스레드에 의해 언두 블록이 회수된다.
특히 mysql는 기본적으로 repeatable-read의 isolation level을 사용하므로, 언두가 쉽게 커져 디스크 공간을 낭비하거나, purge가 트랜잭션이 많은 시간대에 수행되어 성능저하가 발생할수 있다.
5. 2. postgresql
Old version의 별도 공간이 없다. 동일한 페이지내에 old/new가 같이 존재하므로 vacuum작업을 통해 페이지를 새롭게 재구성하면서 오래된 공간을 회수한다.
참고사항
https://www.slideshare.net/pgday_seoul/mvcc-in-postgre
https://www.datanet.co.kr/news/articleView.html?idxno=116534
https://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid
'Database > DB' 카테고리의 다른 글
postgreSQL core (2) | 2020.06.15 |
---|---|
DBMS core architecture 2 (0) | 2020.06.14 |
postgreSQL 튜닝 (0) | 2020.06.11 |
ERROR: cannot change sequence "*****" (0) | 2020.06.03 |
프로그래머스 SQL 고득점 KIT (0) | 2020.04.17 |