본문 바로가기

PostgreSQL

09. transaction snapshot

transaction snapshot이란?

특정 시점에  모든 transaction의  상태가 active 상태인 정보를 저장하는 것을 의미함.

active상태란 transaction이 in_progress이거나 아직 시작되지 않은 것을 의미.

 

아래 쿼리의 결과로 설명을 하자면 세미콜론으로 구분되며 의미는 아래와 같음.

xmin:xmax:xmin과 xmax 사이에 active 상태인 txid

SELECT pg_current_snapshot();
 pg_current_snapshot
---------------------
 100:104:100,102

 

그림으로 표현하면 아래와 같음.

 

위 그림에서 (a)의 의미는

txid가 99이하인 경우 active 상태인 txid는 없으며 100이상의 txid가 active 상태라는 것을 의미

즉, 100 이상의 txid가 in_progress이거나 아직 사용되지 않았음을 의미함.

 

위 그림에서 (b)의 의미는

txid가 99이하인 경우 active 상태인 txid가 없으며 104이상인 txid가 active 상태임.

그리고 100이상 104이하에서 active인 txid는 100, 102라는 것을 의미함.

 

ISOLATION LEVEL에 따른 snapshot 생성 빈도

transaction snapshot은 transaction manager가 제공.

획득한 transaction snapshot은 tuple의 visibility check를 위해 사용됨.

 

READ COMMITED isolation level

     transaction내 SQL문이 실행될 때마다 snapshot을 획득함.

 

REPEATABLE READ or SERIALIZABLE isolation level

    transaction 내 첫 번째 SQL문이 실행될 때만 snapshot을 획득함.

 

visiblity check를 위해 사용되는 snapshot의 중요 규칙

visibility check를 위해 획득된 trsnaction snapshot을 사용할 때 snapshot내 active transaction이 실제 commit이 되거나 aborted되었더라도 IN_PROGRESS로 처리되어야 함.

 

이유?

READ COMMITED, REPEATABLE READ, SERIALIZABLE 간  동작방식이 달라질 수 있기 때문

 

transaction manager와 transaction 예시

위의 내용을 바탕으로 아래 그림을 가지고 설명

 

transaction manager는 항상 현재 수행되고 있는 transaction들에 대한 정보를 저장함.

 

위 그림을 보면 transaction A, B, C순으로 트랜잭션이 시작됨.

A,B는 isolation level이 READ COMMITED

C는 isolation level이  REPEATABLE READ

 

T1 시점:

    transaction A가 시작되고 select문을 실행함.

    select 문이 실행횔 때 transaction A는 txid와 그 시점의 snapshot을 요청함.

    transaction manager는 txid 200을 할당하고 transaction snapshot "200:200"을 반환함.

T2 시점:

    transaction B가 시작되고 seelect 문을 실행함.

    transaction manger는 txid 201을 할당하고 transaction snapshot "200:200"을  반환함.

    왜냐하면 txid 200이 아직 IN_PROGRESS 상태이기 때문임.

    즉, transaction B에서 transaction A를 볼 수 없음.

T3 시점:

    transaction C가 시작되고 select 문을 실행함.

    transaction manager가 txid 202를 할당하고 transaction snapshot "200:200"을 반환함.

    왜냐하면 txid 200, txid 201 모두 IN_PROGRESS 상태이기 때문임.

    즉, transaction C에서 transaction A,B를 볼 수 없음.

T4 시점:

     transaction A가 commit됨.

     transaction manager는 txid 200에 대한 정보를 제거함.

T5 시점:

      transaction B와 transaction C는 각각 select문을 실행.

      transaction B

          transaction snapshot을 transaction manager에게 요청. (READ COMMITED isolation level이기 때문.)

          transaction snapshot은 transaction A가 commit됨에 따라  "201:201"로 변경됨.

          transaction B에서 transaction A는 visialbe 상태임.

      transaction C

          transactoin snapshot을 요청하지 않음.

          transaction C의 transaction snapshot은 그대로 "200:200"

          transaction C에서는 여전히 transactoin A,B가 invisible 상태임

 

 

snapshot 관련 function

https://www.postgresql.org/docs/current/functions-info.html#FUNCTIONS-INFO-SNAPSHOT

      

 

 

 

 

 

 

'PostgreSQL' 카테고리의 다른 글

11. PostgreSQL - Lost updates  (4) 2024.12.21
10. visibility check rules  (4) 2024.12.19
08. PostgreSQL - commit log  (2) 2024.12.18
07. PostgreSQL - transaction처리 이해하기  (5) 2024.12.17
06. PostgreSQL - MVCC 개념  (4) 2024.12.17