RealMySQL 8.0 ์ ์ฝ๊ณ ์ ๋ฆฌํ์ต๋๋ค.
๋ชฉ์ฐจ
- ํธ๋์ญ์
- MySQL ์์ง์ ์ ๊ธ
- InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ ๊ธ
- MySQL์ ๊ฒฉ๋ฆฌ ์์ค
ํธ๋์ญ์ (Transaction)
์์ ์ ์์ ์ฑ์ ๋ณด์ฅํด ์ฃผ๋ ๊ฒ
- 100% : ๋ชจ๋ ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌํ๊ฑฐ๋
- 0% : ์ฒ๋ฆฌํ์ง ๋ชปํ ๊ฒฝ์ฐ์๋ ์ ์ํ๋ก ๋ณต๊ตฌํด์ ์์ ์ ์ผ๋ถ๋ง ์ ์ฉ๋๋ ํ์(Partial update)์ ๋ฐฉ์ง
์ ๊ธ(Lock)
๐ค ์ ๊ธ ์์ด ์ฌ๋ฌ ์ปค๋ฅ์
์ด ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๋ณ๊ฒฝํ๋ค๋ฉด?
๊ทธ ๋ฐ์ดํฐ์ ๊ฐ์ ์์ธกํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฆ, ์ฌ๋ฌ ์ปค๋ฅ์
์์ ๋์์ ๋์ผํ ์์์ ์์ฒญํ ๊ฒฝ์ฐ
์์๋๋ก ํ ์์ ์๋ ํ๋์ ์ปค๋ฅ์
๋ง ๋ณ๊ฒฝํ ์ ์๋๋ก ๋์์ฑ์ ์ ์ดํ๋ ์ญํ
- ํธ๋์ญ์ : ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ๋ฅ
- ์ ๊ธ : ๋์์ฑ์ ์ ์ดํ๊ธฐ ์ํ ๊ธฐ๋ฅ
๊ฒฉ๋ฆฌ ์์ค(Isolation level)
ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋๋ ์ฌ๋ฌ ํธ๋์ญ์ ๊ฐ์ ์์ ๋ด์ฉ์ ์ด๋ป๊ฒ ๊ณต์ ํ๊ณ ์ฐจ๋จํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๋ ๋ฒจ
1. ํธ๋์ญ์
- ๋จ์ผํ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์
- ๋ ผ๋ฆฌ์ ์ธ ์ด์ ๋ก ์ฌ๋ฌ SQL๋ฌธ๋ค์ ๋จ์ผ ์์ ์ผ๋ก ๋ฌถ์ด์ ๋๋์ด์ง์ง ์๊ฒ ๋ง๋ ๊ฒ
- ์ฟผ๋ฆฌ๊ฐ ์ผ๋ถ๋ง ์ฑ๊ณตํด์ DB์ ๋ฐ์๋๋ ์ผ์ด ์ผ์ด๋์ง ์๊ฒ ๋ง๋ ๊ฒ
๐ค ํธ๋์ญ์ ์ด ๋ณด์ฅํด์ฃผ๋ ๊ฒ์?
์์
์
์ 100% (COMMIT
) ๋๋ 0% (ROLLBACK
)๋ก ๋ง๋ค์ด ์์
์
์ ์ ํฉ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๐ก ํธ๋์ญ์ ๊ด์ ์์ MyISAM๊ณผ InnoDB์ ์ฒ๋ฆฌ ๋ฐฉ์ ์ฐจ์ด ์ดํด๋ณด๊ธฐ
- MyISAM, MEMORY ์คํ ๋ฆฌ์ง ์์ง : ํธ๋์ญ์
์ง์ X
→ ๋ถ๋ถ ์ ๋ฐ์ดํธ ๋ฐ์
→ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ง์ถ๊ธฐ ์ด๋ ค์์ง
→ ๋ถ๊ธฐ ์ฒ๋ฆฌ + ๋ฐ์ดํฐ ํด๋ ์ง ์ฝ๋๊น์ง ํ์ํ๊ฒ ๋จ - InnoDB : ํธ๋์ญ์
์ง์ O
→ ๊ฐ๋จํ ์ฝ๋๋ก ๊ตฌํ ๊ฐ๋ฅ
โ ๏ธ ์ฃผ์์ฌํญ
- ์ปค๋ฅ์
์ ํ์ํ ์์ ์ ์์ฑํ๊ธฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฅ์ ๊ฐ์๊ฐ ์ ํ๋์ด์์ด์ ๋ถํ์ํ ์์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์์ ํ๊ณ ์์ง ์๋๋ก ํ์ํ ์์ ์ ์์ฑํด์ผํฉ๋๋ค.
- ํธ๋์ญ์
์ ์ ์ ํ ๋ถ๋ฆฌ๊ฐ ์ค์ํ๋ค
- ์๋ง๋ ๋ ผ๋ฆฌ๋จ์๋ก ์์ ์ ์ ์ ํด, ๊ทธ ๋ถ๋ถ๋ง ํธ๋์ญ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ํธ๋์ญ์ ์ค์ ๋ฌธ์ ๋ฐ์ ์ Rollback์ ํ๊ฒ ๋๋๋ฐ, ํธ๋์ญ์ ์ ๋ฒ์๊ฐ ์ปค์ง๋ฉด, DB์ ๊ด๋ จ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ Rollback์ด ๋ ์๋ ์๊ณ , ๊ฐ์ ์์ ์ ์ด ์๋๋ฐ ๊ฐ์ด Rollback ๋ ์ ์์ต๋๋ค.
- ์ธ๋ถ ์๋ฒ๋ฅผ ์ด์ฉํ ๋ฉ์ผ ์ ์ก์ด ํธ๋์ญ์ ์ ํฌํจ๋ ๊ฒฝ์ฐ, ๋ฉ์ผ ์๋ฒ๊ฐ ๋ถ์์ ํ๋ฉด, DBMS๋ ๊ฐ์ด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ ๋ถ๋ฆฌํด์ผํฉ๋๋ค.
2. MySQL ์์ง์ ์ ๊ธ
MySQL์์ ์ฌ์ฉ๋๋ ์ ๊ธ์ ํฌ๊ฒ MySQL ์์ง ๋ ๋ฒจ
๊ณผ ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ
๋ก ๋๋ ์ ์์ต๋๋ค.
- MySQL ์์ง ๋ ๋ฒจ์ ์ ๊ธ : ๋ชจ๋ ์คํ ๋ฆฌ์ง ์์ง์ ์ํฅ์ ๋ฏธ์นจ
- ๊ธ๋ก๋ฒ ๋ฝ
- ํ ์ด๋ธ ๋ฝ
- ๋ฉํ๋ฐ์ดํฐ ๋ฝ
- ๋ค์๋ ๋ฝ (์ ์ ๋ ๋ฒจ ๋ฝ)
- ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ์ ์ ๊ธ : ์คํ ๋ฆฌ์ง ์์ง ๊ฐ ์ํธ ์ํฅ์ ๋ฏธ์น์ง ์์
- ๋ ์ฝ๋ ๋ฝ
- ๊ฐญ ๋ฝ
- ๋ฅ์คํธ ํค ๋ฝ
- ์๋ ์ฆ๊ฐ ๋ฝ
๊ธ๋ก๋ฒ ๋ฝ
MySQL์์ ์ ๊ณตํ๋ ์ ๊ธ ์ค ๊ฐ์ฅ ๋์ ๋ฒ์์ ๋๋ค.
- ์ํฅ์ ๋ฏธ์น๋ ๋ฒ์ : MySQL ์๋ฒ ์ ์ฒด
- ์์ ๋์ ํ ์ด๋ธ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๊ด ์์ด ๋์ผํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ MyISAM์ด๋ MEMORY ํ
์ด๋ธ์ ๋ํด
mysqldump
๋ก ์ผ๊ด๋ ๋ฐฑ์ ์ ๋ฐ์์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
-- ๊ธ๋ก๋ฒ ๋ฝ ํ๋
mysql> FLUSH TABLES WITH READ LOCK;
-- UNLOCK
mysql> UNLOCK TABLES;
๐ค ํ ์ธ์ ์์ ๊ธ๋ก๋ฒ ๋ฝ์ ํ๋ํ๋ฉด?
- ํด์ ๋ ๋๊น์ง SELECT๋ฅผ ์ ์ธํ ๋๋ถ๋ถ์ DDL์ด๋ DML ๋ช ๋ น์ด ๋๊ธฐ ์ํ๊ฐ ๋ฉ๋๋ค.
๐ก ๋ฐฑ์ ๋ฝ์ ๋ฑ์ฅ
- ๊ธ๋ก๋ฒ ๋ฝ์ MySQL ์๋ฒ ์ ์ฒด ํ ์ด๋ธ์ ์ฝ๊ธฐ ์ ๊ธ์ ๊ฑธ์ด๋ฒ๋ ค ๊ฐ๊ธ์ ์ฌ์ฉ์ ์ง์ํฉ๋๋ค.
- 8.0๋ถํฐ๋ ํธ๋์ญ์ ์ ์ง์ํ๋ InnoDB๊ฐ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ์ฑํ๋์ด ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์ ์ ๋ฉ์ถ ํ์๋ ์์ด์ก์ต๋๋ค.
- ๋ฐฑ์ ํด๋ค์ ๊ธ๋ก๋ฒ ๋ฝ ์ํฉ์๋ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ์ง๋ง ๋ฐฑ์ ๋์ค์ ์คํค๋ง๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฐฑ์ ์ด ์คํจ๋ฉ๋๋ค.
- ์ด๋ฌํ ์ํฉ์ ๋ง๊ธฐ ์ํด ๋ฐฑ์ ๋ฝ์ด ๋์ ๋์์ต๋๋ค.
-- ๋ฐฑ์
์คํ
mysql> LOCK INSTANCE FOR BACKUP;
-- UNLOCK
mysql> UNLOCK INSTANCE;
๐ค ํน์ ์ธ์ ์์ ๋ฐฑ์ ๋ฝ์ ํ๋ํ๋ฉด?
- ๋ชจ๋ ์ธ์
์์ ํ
์ด๋ธ์ ์คํค๋ง๋ ์ฌ์ฉ์์ ์ธ์ฆ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ํ ์ด๋ธ ๋ฑ ๋ชจ๋ ๊ฐ์ฒด ์์ฑ ๋ฐ ๋ณ๊ฒฝ, ์ญ์
REPAIR TABLE
๊ณผOPTIMIZE TABLE
๋ช ๋ น- ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ฐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
- ์ผ๋ฐ์ ์ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค.
ํ ์ด๋ธ ๋ฝ
๊ฐ๋ณ ํ ์ด๋ธ ๋จ์๋ก ์ค์ ๋๋ ์ ๊ธ์ผ๋ก ๋ช ์์ ๋ฐฉ๋ฒ๊ณผ ๋ฌต์์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ช ์์ ๋ฐฉ๋ฒ
-- ํ
์ด๋ธ ๋ฝ
LOCK TABLES table_name [ READ | WRITE ]
-- UNLOCK
UNLOCK TABLES;
๋ฌต์์ ๋ฐฉ๋ฒ
- ์ฟผ๋ฆฌ ์คํ ์ ์๋์ผ๋ก ์ ๊ธ ๋๋ ํด์ ๊ฐ ๋ฉ๋๋ค.
- MyISAM, MEMORY
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ํ DML ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋
- InnoDB
- ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ๋ DDL ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋
- InnoDB ํ ์ด๋ธ์ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋จ์ DML ์ฟผ๋ฆฌ๋ก ์ธํด์๋ ํ ์ด๋ธ ๋ฝ์ด ์ค์ ๋์ง ์์ต๋๋ค.
๋ค์๋ ๋ฝ
์์์ ๋ฌธ์์ด์ ๋ํด ์ ๊ธ์ ์ค์ ํ๋ฉฐ ์ ์ ๋ ๋ฒจ ๋ฝ์ผ๋ก๋ ๋ถ๋ฆฝ๋๋ค.
๐ค ๋ฌธ์์ด์ ์ ๊ธ์ ๊ฑด๋ค๋ ๊ฑด ์ด๋ค ์๋ฏธ์ผ๊น?
๋จ์ํ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๋ฌธ์์ด ์์ฒด์ ์๋ฏธ๋ฅผ ๋์ด ๊ฐ์ ์ํฉ์ ๋ง๋ค์ง ์๋ ์ฉ๋์
๋๋ค.
์๋ฅผ ๋ค๋ฉด ํน์ ์ ์ ๊ฐ ๋์ผ ์์
์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด
ํธ๋์ญ์
์ GET_LOCK("user_name")
์ผ๋ก ๋ฝ์ ๊ฑธ์ด ๋์ผํ user์ ํด๋น ์์
์ ์ ๊ธ์์ผ ๋ฒ๋ฆด ์ ์์ต๋๋ค.
-- "mylock"์ด๋ผ๋ ๋ฌธ์์ด์ ๋ํด ์ ๊ธ์ ํ๋ํ๋ค. ์ด๋ฏธ ์ ๊ธ์ ์ฌ์ฉ ์ค์ด๋ฉด 2์ด ๋์๋ง ๋๊ธฐํ๋ค.
select get_lock('mylock', 2);
-- "mylock"์ด๋ผ๋ ๋ฌธ์์ด์ ๋ํด ์ ๊ธ์ด ์ค์ ๋ผ ์๋์ง ํ์ธํ๋ค.
select is_free_lock('mylock');
-- "mylock"์ด๋ผ๋ ๋ฌธ์์ด์ ๋ํด ํ๋ํ๋ ์ ๊ธ์ ๋ฐ๋ฉ(ํด์ )ํ๋ค.
select release_lock('mylock');
-- 3๊ฐ ํจ์ ๋ชจ๋ ์ ์์ ์ผ๋ก ๋ฝ์ ํ๋ํ๊ฑฐ๋ ํด์ ํ ๊ฒฝ์ฐ์๋ 1์, ์๋๋ฉด NULL์ด๋ 0์ ๋ฐํํ๋ค.
- 8.0 ๋ถํฐ ๋ค์๋ ๋ฝ์ ์ค์ฒฉํด์ ์ฌ์ฉํ ์ ์๊ณ , ๋์์ ๋ชจ๋ ํด์ ํ๋ ๊ธฐ๋ฅ๋ ์ถ๊ฐ๋์์ต๋๋ค.
- ์ฑ ์๋ 8.0 ๋ถํฐ๋ผ๊ณ ํ์ง๋ง ๊ณต์ ๋ํ๋ฅผ ์ฐพ์๋ณด๋ 5.7 ์ด์๋ถํฐ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
- function_release-all-locks, MySQL 5.7 Reference
-- ๋ชจ๋ ๋ฌธ์์ด์ ๋ํ ์ ๊ธ์ ํด์ ํ๋ค. ํด์ ๋ ์ ๊ธ ์๋ฅผ ๋ฐํํ๋ค.
select release_all_locks();
- ์ ์ฉํ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ 1๋์ 5๋์ ์น ์๋ฒ๊ฐ ์ ์ํด ์๋น์คํ๋ ์ํฉ์์ ๋๊ธฐํ๊ฐ ์ค์ํ ๊ฒฝ์ฐ
- ๋ฐฐ์น ํ๋ก๊ทธ๋จ์ฒ๋ผ ๋ง์ ๋ ์ฝ๋์ ๋ํด์ ๋ณต์กํ ์๊ฑด์ผ๋ก ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ํธ๋์ญ์
- ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฐธ์กฐํ๋ ํ๋ก๊ทธ๋จ๋ผ๋ฆฌ ๋ถ๋ฅํด์ ๋ค์๋ ๋ฝ์ ๊ฑธ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋ฐ๋๋ฝ ๋ฐฉ์ง ๊ฐ๋ฅ
๋ฉํ๋ฐ์ดํฐ ๋ฝ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด(ํ ์ด๋ธ์ด๋ ๋ทฐ ๋ฑ)์ ์ด๋ฆ์ด๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์ ํ๋ํ๋ ์ ๊ธ์ ๋๋ค.
- ๋ช ์์ ์ผ๋ก ํ๋ํ๊ฑฐ๋ ํด์ ํ ์ ์๋ ๊ฒ์ด ์๋๊ณ , ํ ์ด๋ธ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ํ๋ํ ์ ์์ต๋๋ค.
- ๋ณดํต ๋ฐฐ์น ํ๋ก๊ทธ๋จ์์ ์ค์๊ฐ์ผ๋ก ํ
์ด๋ธ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ํ์ฌ ์๋น์ค์ฉ ๋ญํน ํ
์ด๋ธ(rank) : rank_backup์ผ๋ก ๋ฐฑ์
์๋ก ๋ง๋ค์ด์ง ๋ญํน ํ ์ด๋ธ(rank_new) : ์๋น์ค์ฉ์ผ๋ก ๋์ฒด
- ํ์ฌ ์๋น์ค์ฉ ๋ญํน ํ
์ด๋ธ(rank) : rank_backup์ผ๋ก ๋ฐฑ์
๐ค ์๋์ฒ๋ผ 2๊ฐ๋ก ๋๋ ์ ์คํํ๋ค๋ฉด?
mysql> RENAME TABLE rank TO rank_backup;
mysql> RENAME TABLE rank_new TO rank;
์์ฃผ ์งง์ ์๊ฐ์ด์ง๋ง rank
ํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์ Table not found 'rank'
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
์๋ ๊ตฌ๋ฌธ ์คํ ์ ์๋์ผ๋ก ๋ ํ ์ด๋ธ ๋ชจ๋ ๋ฉํ๋ฐ์ดํฐ ๋ฝ์ ์๋์ผ๋ก ํ๋ํ๊ณ , ์ ๊ธ์ ์ค์ ํฉ๋๋ค.
mysql> RENAME TABLE rank TO rank_backup, rank_new TO rank;
3. InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ ๊ธ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์..
- MySQL์์ ์ ๊ณตํ๋ ์ ๊ธ๊ณผ๋ ๋ณ๊ฐ๋ก ์คํ ๋ฆฌ์ง ์์ง ๋ด๋ถ์์ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ ๋ฐฉ์์ด ํ์ฌ๋์ด ์์ต๋๋ค.
- ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ ๋ฐฉ์ ๋๋ฌธ์ ํจ์ฌ ๋ฐ์ด๋ ๋์์ฑ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ ์ฝ๋ ๋ฝ
ํ ์ด๋ธ ๋ ์ฝ๋ ์์ฒด๋ฅผ ์ ๊ทธ๋ ๊ฒ์ ๋๋ค.
- ๋ค๋ฅธ ์์ฉ DBMS์ ๋ ์ฝ๋ ๋ฝ๊ณผ ๋์ผํ ์ญํ
- ๋ ์ฝ๋ ์์ค์ ์ ๊ธ์ ์๋นํ ์์ ๊ณต๊ฐ์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ ์ฝ๋ ๋ฝ์ด ํ์ด์ง ๋ฝ, ๋๋ ํ ์ด๋ธ ๋ฝ์ผ๋ก ๋ ๋ฒจ์ ๋๋ ๊ฒฝ์ฐ(๋ฝ ์์ค์ปฌ๋ ์ด์ )์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
- ํ๋ผ์ด๋จธ๋ฆฌ ํค, ์ ๋ํฌ ์ธ๋ฑ์ค๋ก ์กฐํํด์ ํ๋์ ์ธ๋ฑ์ค ๋ ์ฝ๋(row)์๋ง ์ ๊ธ์ ๊ฑฐ๋ ๊ฒ์ ๋๋ค.
- InnoDB๋ ๋ ์ฝ๋ ์์ฒด๊ฐ ์๋๋ผ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ์ ๊ทผ๋ค๋ ์ ์์ ์ค์ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- PK ์ธ๋ฑ์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์๋ ๋ด๋ถ์ ์ผ๋ก ์๋ ์์ฑ๋ ํด๋ฌ์คํฐ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ์ ๊ธ์ ์ค์ ํฉ๋๋ค.
- ๋ณด์กฐ ์ธ๋ฑ์ค์ ์ํ ๋ณ๊ฒฝ ์์
- ๋ฅ์คํธ ํค ๋ฝ
- ๊ฐญ ๋ฝ
- PK ๋๋ ์ ๋ํฌ ์ธ๋ฑ์ค์ ์ํ ๋ณ๊ฒฝ ์์
- ๊ฐญ์ ๋ํด์ ์ ๊ทธ์ง ์๊ณ ๋ ์ฝ๋ ์์ฒด์ ๋ํด์๋ง ์ ๊ธ
๊ฐญ ๋ฝ
๋ ์ฝ๋ ์์ฒด๊ฐ ์๋๋ผ ๋ ์ฝ๋์ ๋ฐ๋ก ์ธ์ ํ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ ๋ง์ ์ ๊ทธ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๋ค๋ฅธ ์์ฉ DBMS์์ ์ฐจ์ด
- ๋ ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์๋ก์ด ๋ ์ฝ๋๊ฐ INSERT ๋๋ ๊ฒ์ ์ ์ดํฉ๋๋ค.
- ๊ฐญ ๋ฝ์ ์ด ์์ฒด๋ณด๋ค๋ ๋ฅ์คํธ ํค ๋ฝ์ ์ผ๋ถ๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฅ์คํธ ํค ๋ฝ
๋ ์ฝ๋ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์ ํฉ์ณ ๋์ ํํ์ ์ ๊ธ์ ๋๋ค.
- ์ธ๋ฑ์ค ๋ ์ฝ๋์ ๊ฐ์ฅ ์ฒ์ ๋ ์ฝ๋์ ์ด์ , ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ๋ ์ฝ๋์ ์ดํ์ ๊ฐญ์๋ ์ ๊ธ์ ์ค์ ํฉ๋๋ค.
- STATEMENT ํฌ๋งท์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ MySQL ์๋ฒ
REAPETABLE READ
๊ฒฉ๋ฆฌ ์์ค ์ฌ์ฉ
- ๐ค
innodb_locks_unsafe_for_binlog
์์คํ ๋ณ์๊ฐ ๋นํ์ฑํ(0)๋๋ฉด?- ๋ณ๊ฒฝ์ ์ํด ๊ฒ์ํ๋ ๋ ์ฝ๋์๋ ๋ฅ์คํธ ํค ๋ฝ ๋ฐฉ์์ผ๋ก ์ ๊ธ์ด ๊ฑธ๋ฆฝ๋๋ค.
- REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์ ํฌํ ๋ฆฌ๋๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ ๊ธ
SELECT * WHERE pk > 99 FOR UPDATE
์คํ ์ ์ผ์ด๋๋ ์ผ๋ค
- pk > 99 ๋ฅผ ๋ง์กฑํ๋ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค ๋ ์ฝ๋ pk=101 ๋ฐ๊ฒฌ
- ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค ๋ฐ๊ฒฌ ์ง์ ์ ์ธ๋ฑ์ค ๋ ์ฝ๋ pk=97๋ถํฐ pk=101 ์ฌ์ด์ ๊ฐญ ๋ฝ ์ ์ฉ
- pk > 99 ์ธ ๋ชจ๋ ์ธ๋ฑ์ค ๋ ์ฝ๋๋ค ์ฌ์ด์๋ ๊ฐญ ๋ฝ ์ ์ฉ
- pk > 99 ์ธ ๋ชจ๋ ์ธ๋ฑ์ค ๋ ์ฝ๋๋ค ์ฌ์ด์๋ ๋ ์ฝ๋ ๋ฝ ์ ์ฉ
- ์ฆ, ๊ฐญ ๋ฝ๊ณผ ๋ ์ฝ๋ ๋ฝ์ด ๋ณตํฉ์ ์ผ๋ก ์ ์ฉ๋๋ ๊ฒ์ ๋ฅ์คํธ ํค ๋ฝ์ด๋ผ๊ณ ํฉ๋๋ค.
InnoDB์ ๊ฐญ ๋ฝ๊ณผ ๋ฅ์คํธ ํค ๋ฝ์ ๋ชฉ์
- ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋ก๋๋ ์ฟผ๋ฆฌ๊ฐ ๋ ํ๋ฆฌ์นด ์๋ฒ์์ ์คํ๋ ๋ ์์ค ์๋ฒ์์ ๋ง๋ค์ด ๋ธ ๊ฒฐ๊ณผ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋๋ก ๋ณด์ฅํ๋ ๊ฒ
- ํ์ง๋ง ์์ธ๋ก ์ด๋ก ์ธํด ๋ฐ๋๋ฝ์ด๋ ๋ฐ์ํ๊ฑฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ง๋๋ ์ผ์ด ์์ฃผ ๋ฐ์ํฉ๋๋ค.
→ ๊ฐ๋ฅํ๋ค๋ฉด ๋ก๊ทธ ํฌ๋งท์ ROW ํํ๋ก ๋ฐ๊ฟ์ ๋ฅ์คํธ ํค ๋ฝ์ด๋ ๊ฐญ ๋ฝ์ ์ค์ด๋ ๊ฒ์ด ์ข์ต๋๋ค.
→ 8.0์์๋ ROW ํํ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๊ฐ ๋ํดํธ๊ฐ ๋์์ต๋๋ค.
๐ก ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํฌ๋งท
STATEMENT
๊ฐ์ฅ ์ค๋๋ ํฌ๋งท์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฟผ๋ฆฌ๋๋ก ์ ์ฅํ๋ ๋ฐฉ์ (5.7 ๊ธฐ๋ณธ)
ํ๋ฒ์ ๋ง์ ๋ณ๊ฒฝ์ ๊ฒฝ์ฐ ํจ๊ณผ์ (WHERE์ ๋ก ์๋ฐฑ๊ฐ ๋ฐ์ดํฐ UPDATE)
ROW
๋ณ๊ฒฝ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๋ชจ๋ ROW์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์ (8.0 ๊ธฐ๋ณธ)
์์ ๋ณ๊ฒฝ์ด ์ฌ๋ฌ๋ฒ ์ผ์ด๋๋ ๊ฒฝ์ฐ ํจ๊ณผ์
MIXED
๋ ๋ฐฉ์์ ํผํฉ
์๋ ์ฆ๊ฐ ๋ฝ
๐ค AUTO_INCREMENT
๊ฐ ์ฌ์ฉ๋ ํ
์ด๋ธ์ ๋์์ ์ฌ๋ฌ ๋ ์ฝ๋๊ฐ INSERT ๋๋ค๋ฉด?
์ค๋ณต๋์ง ์๊ณ ์ ์ฅ๋ ์์๋๋ก ์ฆ๊ฐํ๋ ์ผ๋ จ๋ฒํธ ๊ฐ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด ๋ด๋ถ์ ์ผ๋ก ์๋ ์ฆ๊ฐ ๋ฝ์ด๋ผ๋ ํ ์ด๋ธ ์์ค์ ์ ๊ธ์ ์ฌ์ฉํฉ๋๋ค.
- ํธ๋์ญ์
๊ณผ ๊ด๊ณ์์ด INSERT, REPLACE ๋ฌธ์์ AUTO_INCREMENT ๊ฐ์ ๊ฐ์ ธ์ค๋ ์๊ฐ๋ง ๋ฝ์ด ๊ฑธ๋ ธ๋ค๊ฐ ์ฆ์ ํด์ ๋ฉ๋๋ค.
- UPDATE, DELETE ๋ฌธ์์๋ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
- ๋ช
์์ ์ผ๋ก ํ๋ํ๊ณ ํด์ ํ๋ ๋ฐฉ๋ฒ์ ์์ง๋ง
- ์์ฃผ ์งง์ ์๊ฐ ๋์ ๊ฑธ๋ ธ๋ค๊ฐ ํด์ ๋๋ ์ ๊ธ์ด๋ผ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
- AUTO_INCREMENT ์ปฌ๋ผ์ ๋ช ์์ ์ผ๋ก ๊ฐ์ ์ค์ ํ๋๋ผ๋ ์๋ ์ฆ๊ฐ ๋ฝ์ ๊ฑธ๊ฒ ๋ฉ๋๋ค.
- ์ ๊ธ์ ์ต์ํํ๊ธฐ ์ํด ํ ๋ฒ ์ฆ๊ฐํ๋ฉด ์ ๋ ์๋์ผ๋ก ์ค์ด๋ค์ง ์์ต๋๋ค.
๐ค ๋ ๊ฐ์ INSERT ์ฟผ๋ฆฌ๊ฐ ๋์์ ์คํ๋๋ค๋ฉด?
์๋ ์ฆ๊ฐ ๋ฝ์ ํ ์ด๋ธ์ ๋จ ํ๋๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ฟผ๋ฆฌ๊ฐ ๋ฝ์ ๊ฑธ๋ฉด ๋๋จธ์ง ์ฟผ๋ฆฌ๋ ๋ฝ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
innodb_autoinc_lock_mode
๋ณ์๋ก ์๋ ๋ฐฉ์์ ์ค์ ํ ์ ์์ต๋๋ค. (5.1 ์ด์)
0
๊ฐ : ๋ชจ๋ INSERT๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.1
๊ฐ : ์๋ฒ๊ฐ ๋ ์ฝ๋ ๊ฑด์ ์์ธก ๊ฐ๋ฅ ์ ์๋ ์ฆ๊ฐ ๋ฝ์ ์ฌ์ฉํ์ง ์๊ณ , ํจ์ฌ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋์น(๋ฎคํ ์ค)๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํฉ๋๋ค.2
๊ฐ : ๋ฌด์กฐ๊ฑด ๋์น๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํฉ๋๋ค.
์ธ๋ฑ์ค์ ์ ๊ธ
๋ ์ฝ๋ ๋ฝ์์ ๋์ค๋ ์ธ๋ฑ์ค ์ ๊ธ์ ๋ํด ์์๋ด ๋๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ ๊ทธ๋ ๋ฐฉ์์ด๋?
- ๋ณ๊ฒฝํ ๋ ์ฝ๋๋ฅผ ์ฐพ์ ๋ ๊ฒ์ํ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ฝ์ ๊ฑธ์ด์ผ ํ๋ ๊ฒ
- ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ์ค์ํ ์ด์ ?
- ์ธ๋ฑ์ค๊ฐ ํ๋๋ ์๋ค๋ฉด ํ ์ด๋ธ์ ํ ์ค์บํ๋ฉด์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ ๊ถ์ผ ํ๋ ์ผ์ด ๋ฐ์ํฉ๋๋ค.
์์) ๐ค ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด 1๊ฐ์ UPDATE๋ฅผ ์ํด ๋ช ๊ฐ์ ๋ ์ฝ๋์ ๋ฝ์ ๊ฑธ์ด์ผ ํ ๊น์?
-- ๋ฉค๋ฒ๋ก ๋ด๊ธด ix_firstname์ด๋ผ๋ ์ธ๋ฑ์ค๊ฐ ์ค๋น๋ผ ์๋ค๋ ๊ฐ์ ์ผ๋ก ์งํ
mysql> SELECT COUNT(*) FROM employees WHERE first_name='Georgi';
+-----------+
| 253 |
+-----------+
mysql> SELECT COUNT(*) FROM employees WHERE first_name='Georgi' AND last_name='Klassen';
+-----------+
| 1 |
+-----------+
mysql> UPDATE employees SET hire_date=NOW() WHERE first_name='Georgi' AND last_name='Klassen';
first_name์๋ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ์ง๋ง last_name์๋ ์ธ๋ฑ์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ์ฝ๋ 253๊ฑด์ด ๋ชจ๋ ์ ๊น๋๋ค.
๐ค ๋ง์ฝ ์ธ๋ฑ์ค๊ฐ ์์ ์กด์ฌํ์ง ์๋๋ค๋ฉด?
ํ ์ค์บ์ด ์ผ์ด๋๋ฉด์ 1๊ฐ์ UPDATE๋ฅผ ์ํด ๋ชจ๋ ๋ ์ฝ๋๊ฐ ์ ๊ธฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ UPDATE์ ๊ฐ์ด ์ ๊ธ์ด ๊ฑธ๋ฆฌ๋ ์์
๊ฐ์ ๊ฒฝ์ฐ, ์ ๊ธ์ ๋ฒ์๋ฅผ ์ต์ํ ํ๋๋ก ์ธ๋ฑ์ค ์ค๊ณ๋ฅผ ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ ์ฝ๋ ์์ค์ ์ ๊ธ ํ์ธ ๋ฐ ํด์
๋ ์ฝ๋ ์์ค์ ์ ๊ธ์ ํ ์ด๋ธ ์์ค ์ ๊ธ๋ณด๋ค ์กฐ๊ธ ๋ ๋ณต์กํ๊ณ ๋ฌธ์ ์ ์์ธ์ ๋ฐ๊ฒฌํ๊ณ ํด๊ฒฐํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.
๐ค ๋ฒ์ ๋ณ๋ก ๋ ์ฝ๋ ์ ๊ธ๊ณผ ์ ๊ธ์ ๋๊ธฐํ๋ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด?
- 5.1 ~ : information_schema์ INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WAITS ํ ์ด๋ธ์ ํตํด ํ์ธ
- 8.0 ~ : information_schema ์ ๋ณด๋ ์กฐ๊ธ์ฉ deprecated ๋จ
performance_schema์ data_locks์ data_lock_waits ํ ์ด๋ธ๋ก ๋์ฒด๋๋ ์ค์ ๋๋ค.
๐ค ํน์ ์ค๋ ๋๊ฐ ์ด๋ค ์ ๊ธ์ ๊ฐ์ง๊ณ ์๋์ง ์์ธํ ํ์ธํ๊ณ ์ถ๋ค๋ฉด?
- performance_schema์ data_locks ํ ์ด๋ธ์ด ๊ฐ์ง ์ปฌ๋ผ์ ๋ชจ๋ ์ดํด๋ณด๋ฉด ๋ฉ๋๋ค.
mysql> SELECT * FROM performance_schema.data_locks\G
๐ค ๊ฐ์ ๋ก ์ ๊ธ์ ํด์ ํ๋ ค๋ฉด?
KILL
๋ช ๋ น์ ์ด์ฉํด ํน์ ์ค๋ ๋๋ฅผ ๊ฐ์ ์ข ๋ฃํฉ๋๋ค.
-- KILL {ํน์ ์ค๋ ๋๋ฒํธ}
mysql> KILL 17
4. MySQL์ ๊ฒฉ๋ฆฌ ์์ค
๐ค ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด๋?
์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ฒ๋ฆฌ๋ ๋ ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํ ์ง ๋ชป ๋ณด๊ฒ ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ
๊ฒฉ๋ฆฌ ์์ค
์๋๋ก ๊ฐ์๋ก ๊ณ ๋ฆฝ์ฑ์ด ๋์์ง๋ฉฐ, ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋จ์ด์ง๋๋ค.
DIRTY READ | NON-REPEATABLE READ | PHANTOM READ | ๋น๊ณ | |
---|---|---|---|---|
READ UNCOMMITTED | ๋ฐ์ | ๋ฐ์ | ๋ฐ์ | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
READ COMMTTIED | ์์ | ๋ฐ์ | ๋ฐ์ | ์ค๋ผํด, PostgreSQL (๊ธฐ๋ณธ) |
REPEATABLE READ | ์์ | ์์ | ๋ฐ์(InnoDB๋ ์์) | InnoDB (๊ธฐ๋ณธ) |
SERIALIZABLE | ์์ | ์์ | ์์ | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
AUTOCOMMIT
ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค์ ํ
์คํธ ํ๊ธฐ ์ํด์๋ AUTOCOMMIT
์ OFF๋ก ํด๋์ด์ผ ํฉ๋๋ค.
- MySQL์์๋ default๋ก enabled ๋์ด ์์ต๋๋ค.
-- ํ์ฑํ ์ฌ๋ถ ์กฐํ
mysql> SELECT @@AUTOCOMMIT;
-- OFF๋ก ๋ณ๊ฒฝ
mysql> SET autocommit=OFF;
1. READ UNCOMMITED
ํธ๋์ญ์ ์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด ์์ง COMMIT ๋์ง ์์ ์ํ์์๋ ์กฐํํ ์ ์์ต๋๋ค.
Dirty Read ๋ฌธ์ ๋ฐ์
์ด๋ค ํธ๋์ญ์ ์ ์์ ์ด ์๋ฃ๋์ง ์์๋๋ฐ๋, ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๋ ๋ฐ์ดํฐ ๋ถ์ผ์น ํ์
Dirty Read ๋ฌธ์ ๋๋ฌธ์ ์ค์ DB์ ์๋ ๋ฐ์ดํฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์ A๊ฐ ํธ๋์ญ์
์ ๋๋ง์น์ง ๋ชปํด ๋กค๋ฐฑ์ ํ๋๋ผ๋ ์ฌ์ฉ์ B๋ ๋ฌดํจ๊ฐ ๋ ๋ฐ์ดํฐ ๊ฐ(Lara)๋ฅผ ์ฝ๊ณ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ ๊ฒ์
๋๋ค.
RDBMS ํ์ค์์ ํธ๋์ญ์
์ ๊ฒฉ๋ฆฌ์์ค์ผ๋ก ์ธ์ ํ์ง ์์ ์ ๋๋ก ์ ํฉ์ฑ์ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
2. READ COMMITED
- ์ค๋ผํด, PostgreSQL์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ์์ค
- ์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ์์ค
ํธ๋์ญ์
์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT ๋ ์ํ์์๋ง ์กฐํํ ์ ์์ต๋๋ค.
ํธ๋์ญ์
์ด ์ด๋ฃจ์ด์ง๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
READ COMMITED ๋์ ๋ฐฉ์
์ฌ์ฉ์ A๊ฐ ํธ๋์ญ์
์ ์์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์๊ณ , ์์ง ์ปค๋ฐ์ ํ์ง ์์ ์ํ์
๋๋ค.
๊ทธ๋ฌ๋ฉด ํ
์ด๋ธ์ ๋จผ์ ๊ฐฑ์ ๋๊ณ , ์ธ๋ ๋ก๊ทธ๋ก ๋ณ๊ฒฝ ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ฐฑ์
๋ฉ๋๋ค.
์ด๋ ์ฌ์ฉ์ B๊ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค๊ณ ํ๋ฉด, READ COMMITTED์์๋ ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ ์ ์์ผ๋ฏ๋ก,
์ธ๋ ๋ก๊ทธ์์ ๋ณ๊ฒฝ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์ A๊ฐ ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ฉด ๊ทธ๋๋ถํฐ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ฐธ์กฐํ ์ ์๊ฒ ๋ฉ๋๋ค.
NON-REPLEATABLE READ ๋ฌธ์ ๋ฐ์
ํ๋์ ํธ๋์ญ์ ์์์ ๋๊ฐ์ SELECT ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ์์ฒญํ์ ๋, ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ ๋ฐ์ดํฐ ๋ถ์ผ์น ํ์
์ค๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ปค๋ฐํ ๋ฐ์ดํฐ ๋๋ฌธ์ ํ ํธ๋์ญ์ ์์์ ๊ฐ์ SELECT๋ฌธ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ์์ง๋ง, ๊ธ์ ์ ์ธ ๋ด์ฉ์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ์ค๋ ์
๊ธ๋ ๊ธ์ก์ ์ดํฉ์ ์กฐํํ๋ ์ํฉ์์ NON-REPEATABLE READ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ,
์ดํฉ์ ๊ณ์ฐํ๋ SELECT ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋ ๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ค๋ ์
๊ธ๋ ๊ธ์ก์ ์ดํฉ์ ์กฐํํ๋ ์ํฉ์์ NON-REPEATABLE READ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ,
3. REPEATABLE READ
- InnoDB์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค
- MVCC๋ฅผ ์ด์ฉํด ํ ํธ๋์ญ์
๋ด์์๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒ ๋ณด์ฅํฉ๋๋ค.
- ๋จ, ์๋ก์ด ๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
- ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ
- ๊ฐ๊ฐ์ ํธ๋์ญ์ ์ ์์ฐจ ์ฆ๊ฐํ๋ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ๊ฐ ์กด์ฌํฉ๋๋ค.
- ์ฃผ๊ธฐ์ ์ผ๋ก ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋ MVCC๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์คํ ์ค์ธ ํธ๋์ญ์ ๋ณด๋ค ์ด์ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๊ฐ์ง ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ์ง ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ค๋ณด๋ ํธ๋์ญ์ ์ด ์ ๋ ์ข ๋ฃ๋์ง ์์ผ๋ฉด ์ธ๋ ์์ญ์ด ๋ฌดํ์ ์ปค์ง๊ฒ ๋์ด์ ์ฑ๋ฅ ์ด์๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
- ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๊ฐ์ง MySQL ์๋ฒ์์๋ ์ต์ ์ด ๊ฒฉ๋ฆฌ ์์ค ์ด์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
REPEATABLE READ ๋์ ๋ฐฉ์
- ์ฌ์ฉ์ A๊ฐ emp_no๊ฐ 500000์ธ ์ฌ์์ ์ด๋ฆ์ UPDATE ํ๊ณ
์ฌ์ฉ์ B๊ฐ emp_no๊ฐ 500000์ธ ์ฌ์์ SELECT ํ๋ ๊ณผ์
ํธ๋์ญ์ ์ ์์ํ๊ณ , emp_no๊ฐ 500000์ธ ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ฉด 1๊ฑด์ด ์กฐํ๋๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ์์ง ํธ๋์ญ์ ์ ์ข ๋ฃ๋์ง ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ค๋ฅธ ์ฌ์ฉ์ A์ ํธ๋์ญ์
์์ first_name์ด Toto์ธ ๋ ์ฝ๋๋ฅผ ๊ฐฑ์ ํ๋ ์ํฉ์
๋๋ค.
๊ทธ๋ฌ๋ฉด MVCC๋ฅผ ํตํด ๊ธฐ์กด ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋์ง๋ง, ๋ฐฑ์
๋ ๋ฐ์ดํฐ๊ฐ ์ธ๋ ๋ก๊ทธ์ ๋จ๊ฒ ๋ฉ๋๋ค.
์ด์ ์ ์ฌ์ฉ์ B๊ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ํธ๋์ญ์ ์ ์์ง ์ข ๋ฃ๋์ง ์์ ์ํฉ์์, ์ฌ์ฉ์ B๊ฐ ๋์ผํ SELECT๋ฌธ์ ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ฌ์ฉ์ B์ ํธ๋์ญ์
(10)์ ์ฌ์ฉ์ A์ ํธ๋์ญ์
(12)์ด ์์ํ๊ธฐ ์ ์ ์ด๋ฏธ ์์๋ ์ํ์
๋๋ค.
์ด ๋ REPEATABLE READ๋ ํธ๋์ญ์
๋ฒํธ๋ฅผ ์ฐธ๊ณ ํด ์์ ๋ณด๋ค ๋จผ์ ์คํ๋ ํธ๋์ญ์
์ ๋ฐ์ดํฐ๋ง์ ์กฐํํฉ๋๋ค.
๋ง์ฝ ํ
์ด๋ธ์ ์์ ๋ณด๋ค ์ดํ์ ์คํ๋ ํธ๋์ญ์
์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๋ฉด? ์ธ๋ ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์ A์ ํธ๋์ญ์
์ด ์์๋๊ณ ์ปค๋ฐ๊น์ง ๋์์ง๋ง ํด๋น ํธ๋์ญ์
(12)๋ ํ์ฌ ํธ๋์ญ์
(10)๋ณด๋ค ๋์ค์ ์คํ๋์๊ธฐ ๋๋ฌธ์
์กฐํ ์ ๊ธฐ์กด๊ณผ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
์ฆ, REPEATABLE READ๋ ์ด๋ค ํธ๋์ญ์ ์ด ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์์ ํ๋๋ผ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๊ฒ์ ๋ณด์ฅํด์ค๋๋ค.
READ COMMITED vs. REPEATABLE READ
๐ค ๋ ๊ฒฉ๋ฆฌ ์์ค ๋ชจ๋ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์
ํด๋๋๋ฐ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น์?
READ COMMITED๋ ์ธ๋ ์์ญ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค์ง๋ง, REPEATABLE READ๋ ์ด๋ณด๋ค ํจ์ฌ ์ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
PHANTOM READ ๋ฌธ์ ๋ฐ์
ํธ๋์ญ์ ์์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์์ ๋ ์กด์ฌํ์ง ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์์ ๋ ์ ๋ น์ฒ๋ผ ๋ํ๋๋ ํ์
REAPETABLE READ๋ ์๋ก์ด ๋ ์ฝ๋์ ์ถ๊ฐ๊น์ง๋ ๋ง์ง ์์ต๋๋ค.
๋ฐ๋ผ์ SELECT๋ก ์กฐํํ ๊ฒฝ์ฐ ํธ๋์ญ์
์ด ๋๋๊ธฐ ์ ์ ๋ค๋ฅธ ํธ๋์ญ์
์ ์ํด ์ถ๊ฐ๋ ๋ ์ฝ๋๊ฐ ๋ฐ๊ฒฌ๋ ์ ์๋๋ฐ, ์ด๋ฅผ Phantom Read ๋ผ๊ณ ํฉ๋๋ค.
ํ์ง๋ง MVCC ๋๋ถ์ ์ผ๋ฐ์ ์ธ ์กฐํ์์๋ Phantom Read๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์๋ํ๋ฉด ์์ ๋ณด๋ค ๋์ค์ ์คํ๋ ํธ๋์ญ์
์ด ์ถ๊ฐํ ๋ ์ฝ๋๋ ๋ฌด์ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด ์ธ์ Phantom Read๊ฐ ๋ฐ์ํ๋ ๊ฒ์ผ๊น์?
๋ฐ๋ก ์ ๊ธ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์
๋๋ค.
- ์ฌ์ฉ์ A๊ฐ employees ํ
์ด๋ธ์ INSERT๋ฅผ ์คํํ๋ ๋์ค์
์ฌ์ฉ์ B๊ฐ SELECT FOR UPDATE ์ฟผ๋ฆฌ๋ก employees ํ ์ด๋ธ์ ์กฐํํ๋ ์ํฉ
MySQL์ ๊ฐญ ๋ฝ์ผ๋ก ์ธํด ๋ค๋ฅธ RDBMS์ ๋์์ด ๋ค๋ฅธ ๋ถ๋ถ์ด ์์ด ์ผ๋ฐ์ ์ธ RDBMS ๊ฒฝ์ฐ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ผ๋ฐ์ ์ธ RDBMS
์ฌ์ฉ์ B๊ฐ ๋จผ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ฐ, SELECT FOR UPDATE ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ์์ต๋๋ค.
SELECT ... FOR UPDATE : ๋ฐฐํ ๋ฝ(์ฐ๊ธฐ ์ ๊ธ)์ ๊ฑฐ๋ ๊ฒ
LOCK IN SHARE MODE : ๊ณต์ ๋ฝ(์ฝ๊ธฐ ์ ๊ธ)์ ๊ฑฐ๋ ๊ฒ
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ A๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ผ๋ฐ์ ์ธ DBMS๋ ๊ฐญ ๋ฝ์ด ์๊ธฐ ๋๋ฌธ์ emp_no=500000์ธ ๋ ์ฝ๋๋ง ์ ๊ธ์ด ๊ฑธ๋ฆฐ ์ํ์ด๊ณ , ์ฌ์ฉ์ A์ ์์ฒญ์ ์ ๊ธ ์์ด ์ฆ์ ์คํ๋ฉ๋๋ค.
์ด ๋ ์ฌ์ฉ์ B๊ฐ ๋์ผํ ์ฐ๊ธฐ ์ ๊ธ ์ฟผ๋ฆฌ๋ก ๋ค์ ํ๋ฒ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด ์ด๋ฒ์๋ 2๊ฑด์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋ฉ๋๋ค. ๋์ผํ ํธ๋์ญ์ ๋ด์์๋ ์๋ก์ด ๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ฐ Phantom Read๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค. ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ์๋ MVCC๋ฅผ ํตํด ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ง๋ง, ๋ ๋ฒ์งธ ์คํ๋๋ SELECT FOR UPDATE ๋๋ฌธ์ ๊ทธ๋ด ์ ์์ต๋๋ค.
MVCC์์๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ํ
์ด๋ธ์ ๋ฐ์ํ๊ณ , ์ธ๋ ๋ก๊ทธ์ ๋ฐฑ์
ํฉ๋๋ค.
์ฆ, SELECT FOR UPDATE๋ก ์ ๊ธ์ ๊ฑธ์ด๋ ํ
์ด๋ธ์๋ ๋ฐ์์ด ๋๊ณ , ์ธ๋ ๋ก๊ทธ์๋ ๋ค๋ฅธ ํธ๋์ญ์
์ ์ํ ๋ฐ์ดํฐ๊ฐ ๊ณ์ํด์ ์์ด๋ ๊ฒ์
๋๋ค.
๋ง์ฝ ๋จผ์ ์์๋ ํธ๋์ญ์
์ด ์กด์ฌํ์ฌ ์์
์ ํ๋ฉด ํ
์ด๋ธ์๋ ๋ฐ์๋๊ณ , ์ธ๋ ๋ก๊ทธ์๋ ์ด์ ํธ๋์ญ์
์ ๋ฐ์ดํฐ๊ฐ ์์ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก MVCC ๋ง์ผ๋ก ์ ํํ ๋ฐ์ดํฐ ์ ๊ณต์ด ๋ถ๊ฐ๋ฅํ๊ณ , ์ธ๋ ๋ก๊ทธ์๋ ์ ๊ธ์ ๊ฑธ์ด์ผ ํ๋๋ฐ, ์ธ๋ ๋ก๊ทธ๋ append only ํํ์ด๋ฏ๋ก ์ ๊ธ ์๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ SELECT FOR UPDATE๋ LOCK IN SHARE MODE๋ก ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ ๊ฒฝ์ฐ
์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ํ์ฌ ํ
์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๊ณ , ์ด๋ก ์ธํด Phantom Read๊ฐ ๋ฐ์ํ๋ ๊ฒ์
๋๋ค.
ํ์ง๋ง MySQL์๋ ๊ฐญ ๋ฝ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ์ํฉ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
- MySQL
์ฌ์ฉ์ B๊ฐ SELECT FOR UPDATE๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
MySQL์ emp_no=500000์ธ ๋ ์ฝ๋์๋ ๋ ์ฝ๋ ๋ฝ
, emp_no > 500000์ธ ๋ฒ์์๋ ๊ฐญ ๋ฝ์ผ๋ก ๋ฅ์คํธ ํค ๋ฝ
์ ๊ฒ๋๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์ A๊ฐ emp_no=500001 ์ธ ๋ฉค๋ฒ ์ฝ์
์, ์ฌ์ฉ์ B์ ํธ๋์ญ์
์ด ์ข
๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋ค๊ฐ ๋๊ธฐ๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด ๋ฝ ํ์์์์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก MySQL์ REAPEATABLE READ์์๋ Phantom Read๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
MySQL์์ Phantom Read๊ฐ ๋ฐ์ํ๋ ๊ฑฐ์ ์ ์ผํ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ฉ์ B๋ ํธ๋์ญ์
์ ์์ํ๊ณ , ์ ๊ธ์ด ์๋ SELECT ๋ฌธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ A๋ INSERT ๋ฌธ์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์์ต๋๋ค. ์ด๋ ์ ๊ธ์ด ์์ผ๋ฏ๋ก ๋ฐ๋ก COMMIT์ด ๋ฉ๋๋ค.
ํ์ง๋ง ์ฌ์ฉ์ B๊ฐ SELECT FOR UPDATE๋ก ์กฐํ๋ฅผ ํ๋ค๋ฉด, ์ธ๋ ๋ก๊ทธ๊ฐ ์๋ ํ
์ด๋ธ๋ก๋ถํฐ ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ฏ๋ก Phantom Read๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ์ง๋ง ์ด๋ฌํ ์ผ์ด์ค๋ ๊ฑฐ์ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก,
MySQL์ REPEATABLE READ์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๊ณ ๋ด๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋๋ MySQL ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
- SELECT FOR UPDATE ์ดํ SELECT: ๊ฐญ ๋ฝ ๋๋ฌธ์ ํฌํ ๋ฆฌ๋ X
- SELECT FOR UPDATE ์ดํ SELECT FOR UPDATE: ๊ฐญ ๋ฝ ๋๋ฌธ์ ํฌํ ๋ฆฌ๋ X
- SELECT ์ดํ SELECT: MVCC ๋๋ฌธ์ ํฌํ
๋ฆฌ๋ X
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฐ๋ณต ์ฝ๊ธฐ(๊ธฐ๋ณธ ์์ค)์ธ ๊ฒฝ์ฐ, ๋์ผํ ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ์ผ๊ด๋ ์ฝ๊ธฐ๋ ํด๋น ํธ๋์ญ์ ์ ์ฒซ ๋ฒ์งธ ์ฝ๊ธฐ์ ์ํด ์ค์ ๋ ์ค๋ ์ท์ ์ฝ์ต๋๋ค. ํ์ฌ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ ๊ทธ ํ์ ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ์ฟผ๋ฆฌ์ ๋ํ ์ต์ ์ค๋ ์ท์ ์ป์ ์ ์์ต๋๋ค.
- https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
- SELECT ์ดํ SELECT FOR UPDATE: ํฌํ ๋ฆฌ๋ O
๐ค INSERT ์ ์ PHANTOM READ๊ฐ ์๊ธธ๊น?
์ธ๋ ๋ก๊ทธ๋ ์ ๊ธ์ ๊ฑธ์๊ฐ ์์ด์ ํ์ฌ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋ค.
SELECT FOR UPDATE ๋ฌธ์ผ๋ก ์ด๋ฏธ ์ฐ์ฌ์ง ๋ ์ฝ๋๋ค์ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ๋ฉด์ ์ฝ๊ธฐ ๋๋ฌธ์
์ธ๋ ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ๋ ค ํ์ง๋ง INSERT ๋ ์ธ๋ ๋ก๊ทธ๋ ์ ๊ธ์ ๊ฑธ ์๊ฐ ์์ด์ ํ์ฌ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ฉ๋๋ค.
NON-REPEATABLE READ vs. PHANTOM READ
- NON-REPEATABLE READ : ์๋ ์๋ ํ์ ๊ฐ์ด ๋ฌ๋ผ์ง๋ ๊ฒ
- PHANTOM READ : ์๋ก์ด ํ์ด ์๊ธฐ๋ ๊ฒ
๐ค InnoDB์ REPEATABLE READ์์๋ ์ PHANTOM READ๊ฐ ์๊ธฐ์ง ์์๊น?
PHANTOM READ๋ ์ธ๋ ์์ญ์ ๋ฝ์ ๋ชป๊ฑธ์ด์ ๋ฐ๋ก ๋ณ๊ฒฝ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ค๋ณด๋ ์๊ธฐ๋ ํ์์ธ๋ฐ
InnoDB๋ ๊ฐญ ๋ฝ๊ณผ ๋ฅ์คํธ ํค ๋ฝ์ ์ฌ์ฉํด ํ์ฌ ํธ๋์ญ์
์์ ๊ฒ์ํ๋ ๋ ์ฝ๋์ ์ฃผ๋ณ์ ๊ฐญ์ ์ ๊ธ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์
๊ฐญ์ ์ ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ ์ ์์ด์ PHANTOM READ๊ฐ ์๊ธฐ์ง ์์ต๋๋ค.
4. SERIALIZABLE
ํ ํธ๋์ญ์ ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- PHANTOM READ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฝ์ ๋๋ค.
- ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ด๊ณ , ๊ฐ์ฅ ๋ฎ์ ๋์์ฑ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค.
- InnoDB๋ ์์ํ SELECT ์ฝ๊ธฐ ์์ ์ ๊ฒฝ์ฐ ์ ๊ธ์ด ํ์์๋ ์ผ๊ด๋ ์ฝ๊ธฐ๋ฅผ ์ง์ํ๋ฏ๋ก ์๋ฌด๋ฐ ๋ ์ฝ๋ ์ ๊ธ ์์ด ์คํ๋ฉ๋๋ค.
- ์ฝ๊ธฐ ์์ ๋ ์ฝ๊ธฐ ์ ๊ธ์ด ๋ฌด์กฐ๊ฑด ๊ฑธ๋ ค์ผ ํ๊ณ , ๋ฐ๋ผ์ ๊ฐ์ ์ฝ๊ธฐ ์์ ์ด ์๋๋ผ๋ฉด ํธ๋์ญ์ ์ ๋ชจ๋ ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค.
- InnoDB์์๋ PHANTOM READ ํ์์ด
REPEATABLE READ
๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค.