RDBMS와 MVCC 아키텍처

MVCC 아키텍처의 발전

RDBMS와 Concurrency Control

MVCC 발전

1970년

1974년

1976년

1978년

1981년

1984년

1986년

1999년

MVCC의 두 가지 흐름

첫번째 흐름

MGA 예제

     
XMIN 10 XMAX – TUPLE 1
XMIN 10 XMAX – TUPLE 2
XMIN 10 XMAX – TUPLE 3
     
XMIN 10 XMAX – TUPLE 1
XMIN 10 XMAX 30 OLD TUPLE 2
XMIN 10 XMAX – TUPLE 2
XMIN 10 XMAX – TUPLE 3
XMIN 30 XMAX – NEW TUPLE 2
PAGE HEADER

          ... FREE SPACE ...

      [TUPLE 3][TUPLE 2][TUPLE 1][PAGE TAIL]
PAGE HEADER

          ... FREE SPACE ...
                               [NEW TUPLE 2]
  [TUPLE 3][OLD TUPLE 2][TUPLE 1][PAGE TAIL]

두번째 흐름

Rollback segment 예제

data block undo block
ITL(Interested Transaction List) TX(Transaction) Table Slot
Data Row A  
data block   undo block
ITL(Interested Transaction List) ┬XID─> TX(Transaction) Table Slot ┐UBA
Data Row (new Image B) └UBA─> Undo Record(Old Image A)<┘

트랜잭션

샘플 트랜잭션: 계좌의 debit(차변)/credit(대변)

  DML     비고
1 UPDATE savings_accounts SET balance = balance - 500 WHERE account = 3209 Savings 계좌 금액 감소
2 UPDATE savings_accounts SET balance = balance + 500 WHERE account = 3208 Checking 계좌 금액 증가
3 INSERT INTO journal VALUES (journal_seq.NEXTVAL, ‘1B’, 3209, 3208, 500)   트랜잭션 저널에 기록
4 COMMIT WORK     트랜잭션 종료

오라클의 락과 데드락

lock?

lock    
DML Lock 데이터 보호. 테이블 락은 테이블 전체를 잠그고, 로우 락은 선택된 로우만 잠근다 Row Lock(TX), Table Lock(TM)
DDL Lock 스키마 오브젝트의 구조를 보호. 가령 테이블과 뷰의 데이터 사전 정의(Dictionary definition) Exlusive DDL Locks, Share DDL Locks, Breakable Parse Locks
System Lock data file 같은 내부 데이터베이스 구조 보호. Latches, Mutexes, Internal Locks

deadlock?

시간 Session1 Session2  
t0 UPDATE employees UPDATE employees 각 트랜잭션은 수정하려는 로우를 잠그고 있으므로 문제 없다
  SET salary = salary * 1.1 SET salary = salary * 1.1  
  WHERE employees_id = 100; WHERE employees_id = 200;  
  1 row updated. 1 row updated. 나중에 데드락으로 롤백할 때 이 시점의 변경 사항은 롤백하지 않는다
t1 UPDATE employees UPDATE employees 데드락 발생
  SET salary = salary * 1.1 SET salary = salary * 1.1 employees_id=100은 Session1이 잠그고 있고,
  WHERE employees_id = 200; WHERE employees_id = 100; employees_id=200은 Session2가 잠그고 있다
t2 ORA-00060: deadlock detected   Session1은 데드락 시그널을 받고 t1 시점의 UPDATE는 롤백된다
  while waiting for resource   오직 한 세션만 데드락 에러를 받으며, 둘 중 한 세션이 받을 수 있다
t3 SQL> COMMIT;   t0 시점의 수정 사항을 커밋하고 Session1의 트랜잭션이 끝난다
  Commit complete.   t1 시점의 수정 사항은 커밋되지 않는다
t4   1 row updated. t1 시점에 Session1에 의해 막혔던 Session2의 UPDATE가 실행된다
t5   SQL> COMMIT; t0t1 시점의 수정 사항이 커밋되고 Session2는 종료
    Commit complete.  

DBMS별 MVCC 메커니즘 비교

비교 내용

TX 식별자

Old Version 저장 위치

Old Version 포인터

레코드 포인터

페이지 내 레코드 저장 순서

COMMIT 시점의 Action

ReadView 사용 여부

레코드 헤더 크기

트랜잭션 리스트 관리

트랜잭션 처리 위한 ID

  위치정보 시간관련정보
Oracle XID SCN
PostgreSQL   XID
MySQL/InnoDB   TRX_ID

Oracle

F2-1. oracle_segment, extent, data blocks F12-1. logical and physical storage F12-2 Segments, Extents, and Data Blocks Within a Tablespace

erDiagram
    undo_tablespace ||--o{ undo_segments : has
    undo_segments ||--o{ transaction-table : has
    transaction-table {
      string transaction_ID
    }

SQL> UPDATE hr.employees SET salary=salary;
107 rows updated.
SQL> SELECT 
  XID AS "txn id", 
  XIDUSN AS "undo seg", 
  XIDSLOT AS "slot",
  XIDSQN AS "seq", STATUS AS "txn status"
FROM V$TRANSACTION;

txn id undo seg slot seq txn status
---------------- ---------- ---------- ---------- ----------------
0600060037000000 6 6 55 ACTIVE

PostgreSQL

pgsql_tx_id 출처:exem

MySQL/InnoDB

Old Version의 저장위치와 포인터

Oracle - Old Version

PostgreSQL - Old Version

데이터 블록 내의 레코드 관리

Oracle와 PostgreSQL 레코드 관리

트랜잭션의 COMMIT 후 처리

오라클의 커밋 후 처리

PostgreSQL의 커밋 후 처리

COMMAND COMMIT 여부 xmax invalid/aborted xmax committed xmin invalid/aborted xmin committed value
INSERT X 1 0 0 0 $2^{3}$ = 8
INSERT O 1 0 0 1 $2^{3} + 2^{0}$ = 9
DELETE X 0 0 0 1 $2^{0}$ = 1
DELETE O 0 1 0 1 $2^{2} + 2^{0}$ = 5
FROZEN   1 0 1 1 $2^{3} + 2^{1} + 2^{0}$ = 11 = B(hex)

Readview