Database

MVCC (Multi-Version Concurrency Control) ์ดํ•ดํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2026. 3. 8.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ๋™์‹œ์„ฑ ์ œ์–ด์—์„œ ๋น„๊ด€์ ๋ฝ๊ณผ ๋‚™๊ด€์  ๋ฝ ๋ง๊ณ ๋„ MVCC (Multi-Version Concurrency Control) ๋ผ๋Š” ๊ฐœ๋…์„ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. PostgreSQL, MySQL, Oracle ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€์ ์ธ RDBMS๋Š” MVCC ๊ธฐ๋ฐ˜ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ MVCC๊ฐ€ ์ •ํ™•ํžˆ ๋ญ”์ง€, Lock ๋ฐฉ์‹๊ณผ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€, ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ํ•™์Šตํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ธฐ์ค€์€ PostgreSQL ๋กœ ํ•™์Šตํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ DB  ๋งˆ๋‹ค MVCC ๊ธฐ์ˆ ์˜ ๋ฐฉ์‹์ด ์ œ ์˜ˆ์‹œ๋ฅผ ๋ณด์‹œ๊ณ  MYSQL๋„ ์ €๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๊ตฌ๋‚˜ ์ƒ๊ฐํ•˜์‹œ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํฐ ํ‹€์—์„œ ๋ชฉํ‘œ์™€ ๊ฐœ๋…์€ ๊ฐ™์ง€๋งŒ ๊ทธ๊ฑธ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์€ DB ๋งˆ๋‹ค ๊ฐ๊ฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 

 

 

1. MVCC๋ž€ ๋ฌด์—‡์ธ๊ฐ€

MVCC (Multi-Version Concurrency Control) ๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ์ƒ์„ฑํ•œ๋‹ค.

 

์ „ํ†ต์ ์ธ ๋ฐฉ์‹์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

row(id=1)
value = 10

 

ํ•˜์ง€๋งŒ MVCC์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

row(id=1)

version1 → value = 10
version2 → value = 20
version3 → value = 30

 

๊ฐ ํŠธ๋žœ์žญ์…˜์€ ์ž์‹ ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฒ„์ „๋งŒ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ ๋•๋ถ„์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์„œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ณ  ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

2. ์™œ MVCC๊ฐ€ ํ•„์š”ํ• ๊นŒ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์˜ ์ถฉ๋Œ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Transaction A

SELECT balance FROM account WHERE id = 1; // Shared Lock ์žก์Œ

 

Transaction B

UPDATE account SET balance = 200 WHERE id = 1; //Exclusive Lock ์žก์Œ

 

Transaction A๋Š” id ๊ฐ€ 1์ธ  row ์˜ balance ๋ฅผ ์ฝ์œผ๋ ค๊ณ  ํ•˜๊ณ  ์žˆ๊ณ , Transaction B ๋Š”  id ๊ฐ€ 1์ธ  row ์˜ balance ๊ฐ’์„ 200์œผ๋กœ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

์ „ํ†ต์ ์ธ Lock ๊ธฐ๋ฐ˜ DB์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Transaction A๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ฉด Shared Lock์„ ์žก์Šต๋‹ˆ๋‹ค.
Transaction B๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด Exclusive Lock์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 


ํ•˜์ง€๋งŒ Shared Lock๊ณผ Exclusive Lock์€ ์„œ๋กœ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Transaction B๋Š” ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

"์ฝ๊ธฐ → ์“ฐ๊ธฐ ๋Œ€๊ธฐ ๋ฐœ์ƒ"

 

์ด ๊ตฌ์กฐ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋งŽ์•„์งˆ์ˆ˜๋ก Lock ๋Œ€๊ธฐ์™€ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

MVCC๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ƒํ™ฉ์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์ƒํƒœ

balance = 100

 

๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘

Transaction A ์‹œ์ž‘
balance = 100 ์ฝ์Œ

Transaction B
balance = 200 ์—…๋ฐ์ดํŠธ

 

DB ๋‚ด๋ถ€

version1 balance = 100
version2 balance = 200

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด Transaction A๋Š” version1์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋…๋ฆฝ๋˜๊ฒŒ Transaction B๋Š” version2๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ

Transaction A → 100
Transaction B → 200

์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ์„œ๋กœ ๋ง‰์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

3. MVCC ๋‚ด๋ถ€ ๋™์ž‘ ๊ตฌ์กฐ

๋Œ€๋ถ€๋ถ„์˜ MVCC ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ฐ row์— ํŠธ๋žœ์žญ์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL์„ ์˜ˆ๋กœ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

row
 โ”œ xmin (์ƒ์„ฑ ํŠธ๋žœ์žญ์…˜ ID)
 โ”œ xmax (์‚ญ์ œ ํŠธ๋žœ์žญ์…˜ ID)
 โ”” data

xmin ์€ ์ด row๋ฅผ ์ƒ์„ฑํ•œ ํŠธ๋žœ์žญ์…˜ ๊ทธ๋ฆฌ๊ณ  xmax = ์ด row๋ฅผ ์‚ญ์ œํ•œ ํŠธ๋žœ์žญ์…˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ๊ฐ™์€ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ํƒ€์ž„๋ผ์ธ ์ˆœ์œผ๋กœ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•œ๋‹ค๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

1๏ธโƒฃ ์ฒซ ๋ฒˆ์งธ ํŠธ๋žœ์žญ์…˜ — ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

์™ผ์ชฝ์—์„œ ์ฒซ ๋ฒˆ์งธ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

BEGIN
INSERT INTO numbers (1)
INSERT INTO numbers (2)
COMMIT

์ด ์‹œ์ ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๋‘ ๊ฐœ์˜ row๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

MVCC์—์„œ๋Š” row์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

row(value=1)
xmin = cur_tx1
xmax = null

row(value=2)
xmin = cur_tx1
xmax = null

cur_tx1 ์ด ๊ฐ๊ฐ์˜ row๋ฅผ ์ƒ์„ฑํ–ˆ์œผ๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ์˜ xmin ๊ฐ’์€ cur_ tx1์ž…๋‹ˆ๋‹ค.

 

 

 

2๏ธโƒฃ ๋‘ ๋ฒˆ์งธ ํŠธ๋žœ์žญ์…˜ — Snapshot ์ƒ์„ฑ

์˜ค๋ฅธ์ชฝ์—์„œ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

BEGIN

 

์ด ์ˆœ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” snapshot์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Snapshot์€ ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด "ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋œ ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ" ์ž…๋‹ˆ๋‹ค.
์ด snapshot์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ID
  • ํ™œ์„ฑ ํŠธ๋žœ์žญ์…˜ ๋ชฉ๋ก
  • commit ๋œ ํŠธ๋žœ์žญ์…˜

์ด snapshot ๊ธฐ์ค€์œผ๋กœ ์–ด๋–ค row๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

 

cur_trx2 ๊ฐ€ BEGIN ๋˜๋Š” ์‹œ์ ์—๋Š” cur_trx1์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ cur_trx2 ๊ฐ€ BEGIN ๋์„ ๋•Œ ์Šค๋ƒ…์ƒท์€ value๊ฐ€ 1์ธ row๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์Šค๋ƒ…์ƒท์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ COMMIT ํ–ˆ์„ ๋•Œ๋„ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ 0์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

3๏ธโƒฃ ์„ธ ๋ฒˆ์งธ ํŠธ๋žœ์žญ์…˜  SELECT ์‹คํ–‰

cur_trx3 ํŠธ๋žœ์žญ์…˜์ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

BEGIN
-- ๋‹ค๋ฅธ ์ฟผ๋ฆฌ
SELECT * FROM numbers WHERE value = 1

 

cur_trx3 ํŠธ๋žœ์žญ์…˜์ด BEGIN ํ–ˆ์„ ์‹œ์ ์— ์Šค๋ƒ…์ƒท์„ ๋‚จ๊ธฐ๋ฏ€๋กœ cur_trx2 ์™€ cur_trx1์ด ์ปค๋ฐ‹๋œ ์‹œ์ ์ž…๋‹ˆ๋‹ค.

์Šค๋ƒ…์ƒท์˜ row๋Š” value๊ฐ€ 1์ธ row ์™€ value๊ฐ€ 2 ์ธ row 2๊ฐœ๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์Šค๋ƒ…์ƒท์˜ cur_trx4์˜ ๋‚ด์šฉ์€ ๋ฐ˜์˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์‹œ์ ์—์„œ๋Š” ์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— value๊ฐ€ 1์ธ row๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. 

 

trx3 ํŠธ๋žœ์žญ์…˜์˜ snapshot์—์„œ๋Š” DELETE ํŠธ๋žœ์žญ์…˜(tx4) ์ด ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
MVCC์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ "๋ฐ์ดํ„ฐ ์„ธ๊ณ„"๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.(๋ฒ„์ €๋‹)

 

 

 

4๏ธโƒฃ ๋„ค ๋ฒˆ์งธ ํŠธ๋žœ์žญ์…˜์—์„œ DELETE ๋ฐœ์ƒ

์™ผ์ชฝ์—์„œ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

BEGIN
DELETE FROM numbers WHERE value = 1
COMMIT

MVCC์—์„œ๋Š” DELETE๊ฐ€ ์‹ค์ œ๋กœ row๋ฅผ ์ง€์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  row์— xmax๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

row(value=1)
xmin = tx1
xmax = tx4

 

์ด ์˜๋ฏธ๋Š” "tx4 ์ดํ›„์—๋Š” ์ด row๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค" ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” row๊ฐ€ ์•„์ง ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

 

5๏ธโƒฃ ๋‹ค์„ฏ ๋ฒˆ์งธ ํŠธ๋žœ์žญ์…˜  SELECT ์‹คํ–‰

์ด์ œ ๋งˆ์ง€๋ง‰ ์˜ค๋ฅธ์ชฝ cur_trx5 ํŠธ๋žœ์žญ์…˜์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์€ ์ƒˆ๋กœ์šด snapshot์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ด snapshot์—์„œ๋Š” ์ด๋ฏธ DELETE๊ฐ€ ๋ฐ˜์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๋Š” 0 rows๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

4. MVCC์—์„œ SELECT๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ (Snapshot Read)

MVCC์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋  ๋•Œ snapshot์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Transaction A๊ฐ€ ๋‹ค์Œ ์‹œ์ ์— ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Transaction A ์‹œ์ž‘ (txid = 150)

 

์ด ํŠธ๋žœ์žญ์…˜์€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” row๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

xmin <= 150
xmax > 150 OR xmax = null

 

์ฆ‰ Transaction A๋Š” ์ž์‹ ์ด ์‹œ์ž‘๋œ ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋งŒ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ผ๋„ ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

5. MVCC์—์„œ UPDATE

MVCC์—์„œ UPDATE ๋Š” ์กฐ๊ธˆ ํŠน์ดํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. UPDATE๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ์กด row์˜ xmax๊ฐ€ ์„ค์ •๋˜๊ณ , ์ƒˆ๋กœ์šด row๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ ๊ทธ row์˜ xmin์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
์ฆ‰, UPDATE๋Š” ์‹ค์ œ๋กœ๋Š” “DELETE + INSERT”์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

1๏ธโƒฃ UPDATE ์ „ ์ƒํƒœ

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ row๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

value = 10

 

๋‚ด๋ถ€ tuple ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

row version1
xmin = 100
xmax = null
value = 10
  • xmin = 100 → ํŠธ๋žœ์žญ์…˜ 100์ด ์ด row๋ฅผ ์ƒ์„ฑ
  • xmax = null → ์•„์ง ์‚ญ์ œ๋˜์ง€ ์•Š์Œ

 

2๏ธโƒฃ UPDATE ๋ฐœ์ƒ

์ด์ œ ํŠธ๋žœ์žญ์…˜ 200์ด ํ•ด๋‹น ROW์— UPDATE๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

UPDATE numbers SET value = 20 WHERE value = 10;

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด row์˜ ๊ฐ’์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๋ณ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

  • ๊ธฐ์กด row
row version1
xmin = 100
xmax = 200
value = 10

 

  • ์ƒˆ๋กœ์šด ROW ์ƒ์„ฑ
row version2
xmin = 200
xmax = null
value = 20

 

์ฆ‰, "old row → ์‚ญ์ œ ํ‘œ์‹œ", "new row → ์ƒˆ ๋ฒ„์ „" ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜ 100 ๊ณผ ํŠธ๋žœ์žญ์…˜ 200 ์‚ฌ์ด์˜ ํŠธ๋žœ์žญ์…˜ 150์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด,

xmin=100 → ๋ณด์ž„
xmax=200 → ์•„์ง ๋ฏธ๋ž˜

 

value ๋Š” 10์ด ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ 300์€ xmin=200 → ๋ณด์ด๋ฏ€๋กœ value=20 ์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

๋งˆ๋ฌด๋ฆฌ

๊ทธ๋ฆผ์„ ํ†ตํ•ด ์‚ดํŽด๋ณธ MVCC์˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

1๏ธโƒฃ ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ Snapshot์„ ๋ณธ๋‹ค

Transaction A → ๋ณด์ž„
Transaction B → ์•ˆ ๋ณด์ž„

 

2๏ธโƒฃ DELETE๋Š” ์‹ค์ œ ์‚ญ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค

MVCC์—์„œ DELETE, UPDATE ๋Š” ์‹ค์ œ๋กœ row๋ฅผ ์ง€์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ฐ™์€ row๋ผ๋„ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ด๋ฅผ ํ†ตํ•ด ์“ฐ๊ธฐ๋ฝ์ด ๊ฑธ๋ฆฐ ROW์—์„œ๋„ ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ํ•œ ROW ์— ๊ฒฝํ•ฉํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋„ ๋ณด๋‹ค ์กฐ๊ธˆ๋” ์„ฑ๋Šฅ ์ข‹๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์งˆ์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€