MVCC
โข
์ผ๋ฐ์ ์ผ๋ก ๋ ์ฝ๋ ๋ ๋ฒจ์ ํธ๋์ญ์
์ ์ง์ํ๋ DBMS๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
โข
MVCC์ ๊ฐ์ฅ ํฐ ๋ชฉ์ ์ ์ ๊ธ์ ์ฌ์ฉํ์ง ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ค. (InnoDB ์ธ๋ ๋ก๊ทธ๋ฅผ ํตํด ์ ๊ณต)
โข
MVCC๋ Multi Version Concurreny Control์ ์ฝ์๋ก, ํ๋์ ๋ ์ฝ๋์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ๋ฒ์ ์ด ๋์์ ๊ด๋ฆฌ๋๋ค.
MVCC ์์
๊ฒฉ๋ฆฌ ์์ค์ด READ_COMMITTED์ธ MySQL ์๋ฒ์์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ํ
์ด๋ธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํด๋ณด์. READ_COMMITED๋ COMMIT๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์
์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
START TRANSACTION;
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;
Plain Text
๋ณต์ฌ
INSERT ๋ฌธ์ด ์คํ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฉ๋ชจ๋ฆฌ(๋ฒํผํ)์ ๋์คํฌ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ค์๊ณผ ๊ฐ์ด UPDATE ๋ฌธ์ ์คํํด ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ค๊ณ ํ์.
Transaction A> START TRANSACTION;
Transaction A> UPDATE member SET m_area="๊ฒฝ๊ธฐ" WHERE id=1;
Plain Text
๋ณต์ฌ
UPDATE ๋ฌธ์ด ์คํ๋๋ฉด ์ปค๋ฐ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ผ๋จ InnoDB ๋ฒํผํ์ ๋ฐ์ดํฐ๋ ๊ฐฑ์ ๋๊ณ ์ธ๋ ๋ก๊ทธ์๋ ๋ณ๊ฒฝ ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋๋ค.
๋์คํฌ์๋ ์์ ํ ๊ฐ์ผ๋ก ๊ฐฑ์ ๋ผ์ผ ํ๋๋ฐ, ์ด๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋์ ์ํด์ ์ฒ๋ฆฌ๊ฐ ๋๋ฏ๋ก ์์ ์ ๋ฐ๋ผ ์์ง ๊ฐฑ์ ๋์ง ์์์ ์ ์๋ค. (MySQL์ ACID๋ฅผ ๋ณด์ฅํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ฒํผํ๊ณผ ๋ฐ์ดํฐ ํ์ผ์ ๋์ผํ ์ํ๋ผ๊ณ ๊ฐ์ ํด๋ ๋๋ค.)
MVCC๋ฅผ ํตํด ๋์ผํ ๋ ์ฝ๋๊ฐ ์ฌ๋ฌ ๋ฒ์ ์ผ๋ก ๊ด๋ฆฌ๋๊ณ ์๊ณ , ์ด๋ฅผ ํตํด ์ปค๋ฐ ์ด์ ์ ๋ฐ์ดํฐ ์ฝ๊ธฐ, ๋ฐ์ดํฐ ๋กค๋ฐฑ ๋ฑ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด, ํธ๋์ญ์
์ด COMMIT์ด๋ ROLLBACK๋์ง ์์ ์ํ์์ ๋ค๋ฅธ ํธ๋์ญ์
์ด ํด๋น ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
Transaction B> SELECT * FROM member WHERE id=1;
+------+-----------+--------+
| m_id | m_name | m_area |
+------+-----------+--------+
| 12 | ํ๊ธธ๋ | ์์ธ |
+------+-----------+--------+
Plain Text
๋ณต์ฌ
ํ์ฌ๋ READ_COMMITTED ๊ฒฉ๋ฆฌ ์์ค์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ ์์ญ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด m_area๊ฐ '์์ธ'๋ก ๋ฐํ๋๋ค.
ํด๋น ๊ฒฐ๊ณผ๋ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. ๊ฒฉ๋ฆฌ ์์ค์ด READ_UNCOMMITED์ธ ๊ฒฝ์ฐ์๋ InnoDB ๋ฒํผ ํ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ๋ฐํํ๋ค. ๊ฒฉ๋ฆฌ ์์ค์ด READ_COMMITED, REPEATABLE_READ, SERIALIZABLE์ธ ๊ฒฝ์ฐ์๋ ์์ง ์ปค๋ฐ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
๋ง์ฝ COMMIT์ ํ๋ฉด InnoDB๋ ๋ ์ด์์ ๋ณ๊ฒฝ ์์ด ์ง๊ธ์ ์ํ๋ฅผ ์๊ตฌ์ ์ผ๋ก ๋ง๋ ๋ค. ์ปค๋ฐ์ด ๋๋ค๊ณ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๊ฐ ํญ์ ๋ฐ๋ก ์ญ์ ๋์ง๋ ์๋๋ค. ์ธ๋ ์์ญ์ ํ์๋ก ํ๋ ํธ๋์ญ์
์ด ๋๋ ์์ ๋ ๋น๋ก์ ์ญ์ ๋๋ค. ROLLBACK์ ํ๋ฉด ์ธ๋ ์์ญ์ ๋ฐฑ์
๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ ํ๋ก ๋ค์ ๋ณต๊ตฌํ๊ณ , ์ธ๋ ์์ญ์ ๋ด์ฉ์ ์ญ์ ํด๋ฒ๋ฆฐ๋ค.
์ ๊ธ ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ(Non-Locking Consistent Read)
โข
๋์์ฑ ์ ์ด๋ฅผ ์ํด ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋์ ์์ฒญ ์ฒ๋ฆฌ ์๋๊ฐ ๋งค์ฐ ๋จ์ด์ง๋ค.
โข
๊ทธ๋์, InnoDB ์คํ ๋ฆฌ์ง ์์ง์ MVCC ๊ธฐ์ ์ ์ด์ฉํด ์ ๊ธ์ ๊ฑธ์ง ์๊ณ ์ฝ๊ธฐ ์์
์ ์ํํ๋ค.
โข
๊ฒฉ๋ฆฌ ์์ค SERIALIZABLE์ ์ ์ธํ ๋ชจ๋ ์์ค์์ INSERT์ ์ฐ๊ฒฐ๋์ง ์์ ์์ํ ์ฝ๊ธฐ(SELECT) ์์
์ ๋ค๋ฅธ ํธ๋์ญ์
์ ๋ณ๊ฒฝ ์์
๊ณผ ๊ด๊ณ์์ด ํญ์ ์ ๊ธ์ ๋๊ธฐํ์ง ์๊ณ ๋ฐ๋ก ์คํ๋๋ค.
โข
ํน์ ์ฌ์ฉ์๊ฐ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์ง ์ปค๋ฐ์ ์ํํ์ง ์์๋๋ผ๋, ๋ค๋ฅธ ์ฌ์ฉ์์ SELECT ์์
์ ๋ฐฉํดํ์ง ์๋๋ค. (๋ค๋ฅธ ์ฌ์ฉ์๋ ์ธ๋ ๋ก๊ทธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฏ๋ก)
โข
์ด๋ฅผ ์ ๊ธ ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ(Consistent Non-Locking Read)๋ผ๊ณ ํํํ๋ฉฐ, ์ด๋ ์ธ๋ ๋ก๊ทธ๋ฅผ ํตํด ๊ฐ๋ฅํ๋ค.
์ฃผ์์
โข
์ค๋ ์๊ฐ๋์ ํ์ฑ ์ํ์ธ ํธ๋์ญ์
์ผ๋ก ์ธํด MySQL ์๋ฒ๊ฐ ๋๋ ค์ง๊ฑฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โข
์ผ๊ด๋ ์ฝ๊ธฐ๋ฅผ ์ํด ํด๋น ํธ๋์ญ์
์ ์ธ๋ ๋ก๊ทธ๋ฅผ ์ญ์ ํ์ง ๋ชปํ๊ณ ์ ์งํด์ผ๋๊ธฐ ๋๋ฌธ์ด๋ค.
โข
๋ฐ๋ผ์, ํธ๋์ญ์
์ ๋ฒ์๋ฅผ ์ต์ํํ์ฌ ๊ผญ ํ์ํ ๊ณณ์๋ง ํ์ ํ๋ ๊ฒ์ด ์ข๋ค.
Reference
โข
RealMySQL 8.0