[PostgreSQL] Transaction μ™œ, μ–Έμ œ, μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜?

2022. 3. 25. 15:41Β·DataBase/PostgreSQL

🎯 Goals

  • νŠΈλžœμž­μ…˜μ˜ μ‚¬μš© 방법을 μ•Œμ•„λ³Έλ‹€.
  • νŠΈλžœμž­μ…˜μ΄ λ™μž‘ 원리λ₯Ό 그림으둜 μ •λ¦¬ν•œλ‹€.
  • λ™μž‘μ›λ¦¬ 이해λ₯Ό μœ„ν•΄ WAL, CDCκ°€ 무엇인지 μ•Œμ•„λ³Έλ‹€.

 

 

1. νŠΈλžœμž­μ…˜ μ‚¬μš© 방법

BEGIN

νŠΈλžœμž­μ…˜ 블둝 μ΄ˆκΈ°ν™” ν‚€μ›Œλ“œλ‘œ

λͺ¨λ“  λ¬Έμž₯을 ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬ΆλŠ”λ‹€.

`COMMIT` `ROLLBACK` 연산을 λ§Œλ‚˜κΈ° μ „κΉŒμ§€

 

Automacity λ₯Ό 보μž₯ν•˜λŠ” λŒ€ μ‹  

CPU/Disk activity κ°€ 있기 λ•Œλ¬Έμ— μ†λ„λŠ” 더 λŠλ¦¬λ‹€.

 

 

 

WITHOUT BEGIN

기본적으둜 BEGIN 이 μ—†μœΌλ©΄ 각각의 statement (쿼리문)이 λ…λ¦½λœ νŠΈλžœμž­μ…˜μ΄ λœλ‹€.

μ†λ„λŠ” 더 λΉ λ₯΄λ‹€. 

 

 

πŸ“ 이럴 λ•Œ νŠΈλžœμž­μ…˜μ„ 써라

All or Nothing
μ—¬λŸ¬ 쿼리가 ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ‘œ λ¬Άμ—¬μ•Ό ν•  λ•Œ
λ‹€ μ‹€ν–‰λ˜κ±°λ‚˜ λ‹€ μ•ˆλ˜κ±°λ‚˜

 

 


2.  νŠΈλžœμž­μ…˜μ˜ λ™μž‘ 원리

νŠΈλžœμž­μ…˜μ€ μ–΄λ–»κ²Œ COMMIT / ROLLBACK ν•  수 μžˆκ²Œλ˜μ—ˆλ‚˜?

νŠΈλžœμž­μ…˜ λ™μž‘μ˜ 쀑심에 Change Data Capture (CDC) Mechanism 이 μ‘΄μž¬ν•œλ‹€.

Log-Based Change Data Capture

직접 μž‘μ„±

λͺ¨λ“  νŠΈλžœμž­μ…˜μ€ λ‹€μŒκ³Ό 같은 μˆœμ„œλ₯Ό λ”°λ₯Έλ‹€.

  1. WAL 에 둜그λ₯Ό 남긴닀.
  2. CDC κ°€ λ‘œκ·Έμ— λ³€ν™”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ κ°μ§€ν•œλ‹€.
    1. COMMIT -> μ‹€μ œ DB에 λ³€κ²½λœ (Capture 된) 내역을 λ°˜μ˜ν•œλ‹€. (flush to disk, WAL -> Disk)
    2. ROLLBACK ν•˜λ©΄ WAL에 따라 Redo ν•œλ‹€.

 

μ•„λž˜ μ»¬λŸ¬ν’€ν•œ 그림으둜 ν‘œν˜„ν•΄λ³΄μž.

좜처: Striim

 

WAL?

Write Ahead Log λΌλŠ” 이름이 μ™œ νƒ„μƒν–ˆμ„κΉŒ?

λͺ¨λ“  DB νŠΈλžœμž­μ…˜μ€ μ‹€μ œ DB Storage 에 써지기 전에 (Ahead)
버퍼에 둜그(Write Log)λ₯Ό 남긴닀. 

 

Write Ahead Log λŠ” λ‹€μ‹œ 말해  DBμ—μ„œ μΌμ–΄λ‚˜λŠ” λͺ¨λ“  연산을 λ‘œκΉ…ν•΄λ‘λŠ” 곳이닀. 

 

Postgres μ—μ„œλŠ” WAL을 Transaction Log 둜 λͺ…λͺ…ν•˜κΈ°λ„ ν•œλ‹€.

 

WAL νŠΉμ§•

  • λ³€κ²½ 전에 Log λ‚¨κ²¨μ„œ Data Durability 보μž₯.
  • Append μ—°μ‚°
  • λ™μž‘ μ‹œμ μ€ Commit 직전
  • 맀번 Disk 에 μ“Έ 수 μ—†μœΌλ―€λ‘œ Log Buffer 에 μŒ“μ•„λ‘κ³ 
    주기적으둜 flush() (Memory -> Disk)

 

μ™œ WAL 이 ν•„μš”ν•œκ°€?

 λ§€ μΏΌλ¦¬λ§ˆλ‹€ μ‹€μ œ ν…Œμ΄λΈ”μ— 직접 μ“΄λ‹€κ³  κ°€μ •ν•΄λ³΄μž.
(DBλŠ” 물리 μ €μž₯μž₯치, 즉 보쑰 κΈ°μ–΅μž₯μΉ˜μ— 데이터λ₯Ό μ €μž₯ν•œλ‹€λŠ” 점을 κΈ°μ–΅ν•˜μž)

보쑰기얡 μž₯치 I/O λŠ” Cost κ°€ 맀우 높은 μž‘μ—…μ΄λ‹€. 도쀑에 μ·¨μ†Œν• (ROLLBACK)μˆ˜λ„ μžˆλŠ” μ—°μ‚°κΉŒμ§€ 맀번 IOλ₯Ό ν•œλ‹€λ©΄ DB 연산속도가 훨씬 느렀져 λΉ„νš¨μœ¨μ μ΄λ‹€. κ·Έλž˜μ„œ, Disk μ“°κΈ° 연산을 쀄이기 μœ„ν•΄ ν•„μš”ν•˜λ‹€.

 

 

πŸ“ CDC, WAL 을 ν†΅ν•œ νŠΈλžœμž­μ…˜ λ™μž‘ κ³Όμ • 정리

DB에 κ°€ν•΄μ§€λŠ” λͺ¨λ“  INSERT, UPDATE, DELETE λ“±μ˜ DML 을 ν¬ν•¨ν•œ λͺ¨λ“  연산은 WAL에 기둝되고,
이 쀑에 CDCκ°€ λ³€ν™”λœ λ°μ΄ν„°λ§Œμ„ 감지 (Capture) ν•˜μ—¬ λ²„νΌλ§ν•œλ‹€.

COMMIT

CDC에 μ˜ν•΄ 버퍼에 λ‹΄κ²Όλ˜ 데이터듀은 `COMMIT` λ˜λŠ” μˆœκ°„ λͺ¨λ‘ μ‹€μ œ DB (Disk) 에 λ””μŠ€νŒ¨μΉ˜λœλ‹€.

ROLLBACK

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λͺ¨λ“  둜그λ₯Ό WAL 에 κΈ°λ‘ν•˜κΈ° λ•Œλ¬Έμ—, ROLLBACK μ‹œλ„μ‹œ CDC에 μ˜ν•΄ 캑쳐된 λ²„νΌμ˜ 데이터λ₯Ό μ‚­μ œ(Abort)μ‹œν‚€κ³ 
νŠΉμ • WAL 둜그 μƒνƒœλ‘œ λ˜λŒμ•„(ROLLABCK) κ°€λŠ” 것이 κ°€λŠ₯ν•˜λ‹€


πŸ”— Reference

 

BEGIN

BEGIN BEGIN — start a transaction block Synopsis BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ] where …

www.postgresql.org

 

Change Data Capture (CDC): What it is and How it Works | Striim

Change Data Capture is ideal for real time data movement. Learn how it works, the best use cases for CDC, and the role it plays in streaming ETL.

www.striim.com

 

PostgreSQL Streaming Replication - a Deep Dive

In this blog, we are going to review a little bit of the history of PostgreSQL built-in replication features, and deep dive into how streaming replication works.

severalnines.com

 

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)

'DataBase > PostgreSQL' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[PostgreSQL] Transaction + Pool μ‚¬μš©μ‹œ 주의  (0) 2022.04.04
[PostgreSQL] Function (feat. trigger)  (0) 2022.03.29
[PostgreSQL] Notify  (0) 2022.03.25
[PostgreSQL] Sequence ν•¨μˆ˜ 및 κ°’ λ³€κ²½ (λ²ˆμ—­)  (0) 2022.03.25
Description on DB Column  (0) 2022.03.18
'DataBase/PostgreSQL' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [PostgreSQL] Function (feat. trigger)
  • [PostgreSQL] Notify
  • [PostgreSQL] Sequence ν•¨μˆ˜ 및 κ°’ λ³€κ²½ (λ²ˆμ—­)
  • Description on DB Column
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (λ¬Έμ œν’€μ΄) (56)
        • Algorithm (이둠) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (5)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • μž‘λ™μ‚¬λ‹ˆ (27)
      • μž¬ν…Œν¬ (11)
        • 세무 (4)
        • 투자 (3)
        • λ³΄ν—˜ (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • μ‹œμŠ€ν…œ λ³΄μ•ˆ (5)
      • λ„€νŠΈμ›Œν¬ (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • μ €μž‘κΆŒκ³Ό 슀마트폰의 이해 (0)
      • 생각 λ­‰μΉ˜ (6)
      • ꢁ금증 (2)
      • Private (4)
        • 이직 κ²½ν—˜ (0)
        • κΏˆμ„ μ°Ύμ•„μ„œ (1)
      • Android (21)
        • OS (4)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • WEB
    • μ•Œκ³ λ¦¬μ¦˜
    • DataBase
    • Linux
    • Mobile
    • C
    • λ°©λͺ…둝
  • 링크

    • github
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    JPA
    Kotlin
    Git
    java
    PostgreSQL
    Bitcoin
    kafka
    ubuntu
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    android
    javascript
    linux
    Programmers
    database
    μ•Œκ³ λ¦¬μ¦˜
    λ°±μ€€
    algorithm
    docker
    C++
    Spring
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
M_Falcon
[PostgreSQL] Transaction μ™œ, μ–Έμ œ, μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜?
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”