[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)๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ฐธ๊ณ
'BackEnd๐ฑ > DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker MySQL] Proxy Layer ๊ตฌ์ถํ๊ธฐ (0) | 2023.11.12 |
---|---|
[Docker MySQL] Orchestrator๋ฅผ ์ด์ฉํ High Availability(HA) ๊ตฌ์ถํ๊ธฐ (6) | 2023.11.06 |
[Docker MySQL] Master-Slave Replication(๋ณต์ ) ๊ตฌ์ถํ๊ธฐ (0) | 2023.11.01 |
[MySQL] ์ฌ์ฉ์ ์์ฑ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฐฉ๋ฒ (0) | 2023.10.06 |
MySQL์์ VARCHAR์ TEXT์ ์ฐจ์ด (1) | 2023.09.17 |
Redis์ ๋ฐ์ดํฐ ํ์ , ๋ช ๋ น์ด์ ํ์ฉ ์ฌ๋ก (0) | 2023.09.05 |
๋๊ธ