๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/DB & SQL

[MySQL] MVCC๋ฅผ ํ†ตํ•œ ์ž ๊ธˆ์—†๋Š” ์ฝ๊ธฐ

by dkswnkk 2023. 10. 7.

[MVCC(Multi Version Concurrency Control)]

MVCC๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์˜ ํ•ต์‹ฌ์€ ์ž ๊ธˆ(Locking) ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ฝ๋Š” ๊ฒƒ์ด๋ฉฐ, InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ๋‘ ๋กœ๊ทธ(Undo log)๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. '๋ฉ€ํ‹ฐ ๋ฒ„์ „'์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๊ฐœ๋…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ 'member' ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

CREATE TABLE member (
	m_id INT NOT NULL,
	m_name VARCHAR(20) NOT NULL,
	m_area VARCHAR(100) NOT NULL,
	PRIMARY KEY (m_id),
	INDEX ix_area (m_area)
);

INSERT INTO member (m_id, m_name, m_area) VALUES (1, '์•ˆ์ฃผํ˜•', '์„œ์šธ');
COMMIT;

์œ„ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํƒœ๋กœ ๋ฐ”๋€” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

INSERT ํ›„ InnoDB์˜ ๋ฒ„ํผ ํ’€๊ณผ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ์ƒํƒœ

์ด์ œ, ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ 'm_area' ๊ฐ’์„ '๋ถ€์‚ฐ'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” UPDATE ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

UPDATE member SET m_area='๋ถ€์‚ฐ' WHERE m_id=1;

 

UPDATE ํ›„ InnoDB ๋ฒ„ํผ ํ’€๊ณผ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋ฐ ์–ธ๋‘ ์˜์—ญ์˜ ๋ณ€ํ™”

โ€ป ์œ„ ์ด๋ฏธ์ง€์—์„œ InnoDB ๋ฒ„ํผํ’€์˜ '์„œ์šธ'๊ณผ ์–ธ๋‘ ๋กœ๊ทธ์˜ '๋ถ€์‚ฐ'์˜ ๊ธ€์ž๊ฐ€ ์„œ๋กœ ์Šค์œ„์นญ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

'UPDATE' ๋ฌธ์ด ์‹คํ–‰๋˜๋ฉด, ์ปค๋ฐ‹ ์‹คํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด InnoDB์˜ ๋ฒ„ํผ ํ’€์€ ์ƒˆ๋กœ์šด ๊ฐ’์ธ '๋ถ€์‚ฐ'์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€๋งŒ, ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋””์Šคํฌ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์ด์œ ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ACID ํŠธ๋žœ์žญ์…˜ ์†์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด SELECT๋ฅผ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋‚˜ ์„ธ์…˜์—์„œ ์•„์ง COMMIT์ด๋‚˜ ROLLBACK ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค ํ•œ๋‹ค๋ฉด

SELECT * FROM member WHERE m_id=1;

MySQL์˜ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜(transaction_isolation)์— ์„ค์ •๋œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level) ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • READ_UNCOMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” 'UPDATE'๋กœ ๋ณ€๊ฒฝ๋œ '๋ถ€์‚ฐ'์ด๋ผ๋Š” ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ด ์ˆ˜์ค€์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • READ_COMMITTED ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์•„์ง 'UPDATE'๊ฐ€ ์ปค๋ฐ‹๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜์˜ ๊ฐ’์ธ '์„œ์šธ'์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์–ธ๋‘ ๋กœ๊ทธ์—๋Š” '์„œ์šธ'์ด๋ผ๋Š” ์›๋ž˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฑ์—…๋˜์–ด ์žˆ์–ด, ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ 'UPDATE'์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฌด์‹œํ•˜๊ณ  ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ DBMS๋Š” MVCC๋ฅผ ํ™œ์šฉํ•ด ๋™์‹œ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋กค๋ฐฑ์„ ์‹คํ–‰ํ•˜๋ฉด ์–ธ๋‘ ๋กœ๊ทธ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ณต๊ตฌ๋˜๋ฉฐ, ์ปค๋ฐ‹ ์‹œ์—๋Š” ๋ณ€๊ฒฝ์ด ์˜๊ตฌ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

[์ž ๊ธˆ ์—†๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ(Non-LickungConsistent Read)]

InnoDB๋Š” MVCC๋ฅผ ํ™œ์šฉํ•ด ์ž ๊ธˆ ์—†์ด ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ฝ๊ธฐ ์ž‘์—…์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ž ๊ธˆ์— ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ SERIALIZABLE์ด ์•„๋‹Œ READ_UNCOMMITTED๋‚˜ READ_UNCOMMITTED, REPEATABLE_READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์ˆœ์ˆ˜ํ•œ ์ฝ๊ธฐ ์ž‘์—…(SELECT)์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ ์ž‘์—…์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ธ๋‘ ๋กœ๊ทธ๋ฅผ ์ง€์†์ ์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ž ๊ธˆ ์—†๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์—, ํ™œ์„ฑ ํŠธ๋žœ์žญ์…˜์ด ๊ธธ์–ด์ง€๋ฉด ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ํ™œ์„ฑ ์ƒํƒœ์ธ MySQL ์„œ๋ฒ„๊ฐ€ ๋Š๋ ค์ง€๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊ฐ€ ๊ฐ€๋” ์žˆ๋Š”๋ฐ, ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋กค๋ฐฑ์ด๋‚˜ ์ปค๋ฐ‹์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

[์š”์•ฝ]

MVCC๋Š” ํŠธ๋žœ์žญ์…˜ ๋™์‹œ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. InnoDB๋Š” ์ด๋ฅผ ์–ธ๋‘ ๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž ๊ธˆ ์—†๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ(Non-LickungConsistent Read)๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

์ฐธ๊ณ 

Real MySQL 8.0(1๊ถŒ)

๋Œ“๊ธ€