가끔은 이런 날도 있는거지...
Multi-Version Concurrency Control의 약자로
대부분의 DBMS에서 동시성을 위해 제공한다.
동시에 여러 트랜잭션이 수행되는 환경에서 각 트랜잭션에게 쿼리 수행 시점의 데이터를 제공하여 읽기 일관성을 보장하고
Read/Write 간의 충돌 및 lock을 방지하여 동시성을 높일 수 있는 기능으로,
모든 MVCC의 기본 원리는 트랜잭션이 시작된 시점의 Transaction ID와 같거나 작은 Transacion ID를 가지는 데이터를 읽는 것이다.
다른 애들이랑 좀 다르다.
심플하게 말하면
변경되기 이전 tuple과 변경된 tuple을 같은 곳에 그대로 놔둔다.
이런 점 때문에 참조되지 않는 tuple, 즉 dead tuple이 생긴다.
그럼 어떻게 변경된 tuple과 변경 이전 tuple을 구분하는가 하는 의문이 생길텐데
tuple이 생성되거나 변경된 시점을 각 tuple 내 xmin, xmax라는 메타데이터 field에 기록하여 구분한다.
오늘은 조금 아쉬운 하루였다.
오늘 꼭 해결하고 싶은 문제가 있었는데 결국 해결하지 못했기 때문이다.
사실 나는 django-pgtrigger가 나름대로 모델 "필드"별로 protect update를 구현해놓았을 줄 알았다.
근데 모델 자체를 막는 기능은 있지만
특정 필드에 관한 기능은
FSM 클래스를 이용한 transition을 제한하는 기능밖에 없었다.
결국은 custom을 해야했는데
테스트로 작성한 코드가 이유는 모르겠지만 migration 항목에 들어가지 않았다.
거기서부터 막혀서 테스트도 못하고 ~ 와중에 다른 일 들어와서 결국 stop했는데 매우 찜찜했다...
$ sudo -u postgres psql
CREATE DATABASE test_db TEMPLATE template0 LC_COLLATE 'C';
CREATE USER test_user WITH PASSWORD 'password';
ALTER ROLE test_user SET client_encoding TO 'utf8';
ALTER ROLE test_user SET default_transaction_isolation TO 'read committed';
GRANT ALL PRIVILEGES ON DATABASE test_db TO test_user;
pg_dump -f {{dump sql 파일명}} -U {{유저명}} -h 10.0.0.1 -p 5432 -d {{dump하려는 db명}}
psql -f {{dump sql 파일명}} -U {{유저명}} -h 10.0.0.1 -p 5432 -d {{복사하려는 db명}}
사실 어차피 기본 포트는 5432이기때문에 생략 가능하다.