DB์ ๋ํด ๊ณต๋ถํ๋ ์ค, ๋ฌธ๋ ์ด๋๊น์ง ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋จ ํ๋ฒ๋ DB์์ ์ผ์ด๋๋ ๋์์ฑ ๋ฌธ์ ์ ๋ํด ๊ณ ๋ คํด๋ณธ์ ์ด ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ DB ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฒ์ด๋ฉฐ ๋จผ์ ์ด๋ฒ ๊ธ์์๋ ์์ฃผ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค๊ณผ MySQL ๋ฝ์ ๊ดํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
์ด ๊ธ์ ๋๋ถ๋ถ ์ ์ ๊ธฐ์ต์ ์๊ธฐํ์ฌ ์งง๊ฒ ์ด ๊ธ์ด๊ธฐ ๋๋ฌธ์ ์์ธํ ์ ๋ณด๋ฅผ ์ํ์ ๋ค๋ฉด MySQL ๋ํ๋จผํธ๋ฅผ ์ถ์ฒํฉ๋๋ค.
MySQL์์ ์ฌ์ฉ๋๋ ๋ฝ์ ํฌ๊ฒ ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ๊ณผ MySQL ์์ง ๋ ๋ฒจ๋ก ๋๋ ์ ์๋ค. ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ์ ์ ๊ธ์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฝ์ด๋ฉฐ, MySQL ์์ง ๋ ๋ฒจ์ ์ ๊ธ์ ํ ์ด๋ธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ์ํ ๋ฝ์ ํด๋นํ๋ค.
โ๏ธ InnoDB ์์ง ๋ฝ
๐ S-lock (Shared-Lock)๊ณผ X-lock (Exclusive-Lock)
S-lock์ ์ฝ๊ธฐ๋ฝ, ๊ณต์ ๋ฝ์ด๋ผ๊ณ ๋ ํ๋ฉฐ ๋์ ๋ ์ฝ๋์ ๋ํด์ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ๋ ๊ฒ์ ํ์ฉํ์ง๋ง DML ์์ ์ ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ S-lock์ด ๊ฑธ๋ฆฐ ๋ ์ฝ๋์ ๋ํ ์์ ์ ํ๋ค๋ฉด ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋ค.
X-lock์ ์ฐ๊ธฐ๋ฝ, ๋ฒ ํ๋ฝ์ด๋ผ๊ณ ๋ ํ๋ฉฐ ๋ค๋ฅธ ํธ๋์ญ์ ์์ X-lock, S-lock ๋ชจ๋ ๊ฑธ ์ ์๋ค. ์ด ๋ ์ ์ํด์ผํ ์ ์ Select For Update, Update, Delete๋ฅผ ๋ชปํ๋ ๊ฒ์ด์ง ์์ํ Select๋ฅผ ๋ชปํ๋๊ฒ ์๋๋ผ๋ ๊ฒ์ด๋ค.
๐ ๋ ์ฝ๋๋ฝ
ํธ๋์ญ์ ์ด DML๋ฅผ ์งํํ ๋ ๋์ ๋ ์ฝ๋์ ๊ฑฐ๋ ๋ฝ์ผ๋ก InnoDB ์์ง์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ ์ฝ๋์ ์ธ๋ฑ์ค์ ๋ฝ์ ๊ฑด๋ค.
์ด ๋ ์ธ๋ฑ์ค์ ๋ฝ์ ๊ฑฐ๋ ๊ฒ์ ๋ํด ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค.
'O' ์ฑ์ ๊ฐ์ง Member๋ 100๋ช ์ด๊ณ ์ด๋ฆ์ด 'Juyeop'์ธ ์ฌ๋์ 1๋ช ์ด๋ฉฐ ์ธ๋ฑ์ค๋ last_name์ํด์๋ง ๊ฑธ๋ ค ์๋ค๊ณ ํ ๋, ์๋์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๋ฉด ํ๋์ ๋ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ํด 100๊ฐ์ ์ธ๋ฑ์ค ๋ ์ฝ๋์ ๋ฝ์ ๊ฑธ์ด์ผ๋ง ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ๋ ๊ฒ์ ๋์์ฑ์ ํฐ ์ํฅ์ ์ค๋ค.
UPDATE member SET age = 26 WHERE last_name LIKE 'O%' AND first_name = 'Juyeop';
๐ ๊ฐญ ๋ฝ
MySQL๊ณผ ๋ค๋ฅธ RDBMS์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด๋ฉฐ ๋ ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๋ ๊ฒ์ ๋งํ๋ค. ๋ค์ ๋งํด ์ธ๋ฑ์ค ํ ์ด๋ธ์ ์ง์ ๋ ๋ฒ์๋ฅผ ๋์์ผ๋ก ํ๋ ์ ๊ธ์ด๋ค. ์ด๋ ๋์ฒด๋ก ๋จ๋ ์ผ๋ก ์ฌ์ฉ๋์ง ์๊ณ ๋ ์ฝ๋๋ฝ๊ณผ ํจ๊ป ๋ฅ์คํธ ํค ๋ฝ์ผ๋ก ์ฌ์ฉ๋๋ค. ๋ํ ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ค ํ๋์ธ ์กฐํ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ์์์ DML ์์ ์ด ์์ ๋, ์ผ๊ด๋ ์ฝ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋๋ก ํด์ค๋ค.
๐ ๋ฅ์คํธํค ๋ฝ
๋ ์ฝ๋ ๋ฝ๊ณผ ๊ฐญ๋ฝ์ ํฉ์น ์ ๊ธ์ด๋ค.
๊ฐญ ๋ฝ์ด๋ ๋ฅ์คํธ ํค ๋ฝ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋ก๋๋ ์ฟผ๋ฆฌ๊ฐ ๋ฆฌํ๋ฆฌ์นด ์๋ฒ์์ ์คํ๋ ๋ ์์ค ์๋ฒ์์ ๋ง๋ค์ด๋ธ ๊ฒฐ๊ณผ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋๋ก ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ด ์ฃผ๋ชฉ์ ์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์์ธ๋ก ๋ฅ์คํธ ํค ๋ฝ๊ณผ ๊ฐญ ๋ฝ์ผ๋ก ์ธํด ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๊ฑฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ธฐ๋ค๋ฆฌ๋ ์ผ์ด ์์ฃผ ๋ฐ์ํ๋ฏ๋ก, ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํฌ๋งท์ ROW ํํ๋ก ๋ฐ๊ฟ์ ๋ฅ์คํธ ํค ๋ฝ์ด๋ ๊ฐญ ๋ฝ์ ์ค์ด๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
๐ ์๋ ์ฆ๊ฐ ๋ฝ
MySQL์ ์๋ ์ฆ๊ฐํ๋ ์ซ์๊ฐ์ ์ํด AUTO_INCREMENT๋ผ๋ ์ปฌ๋ผ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ ์ฃผ๋ก ๋์ฒดํค์ ์ฌ์ฉ๋๋ค. ์ด๋ AUTO_INCREMENT ์ปฌ๋ผ์ ์ฌ๋ฌ ๋ ์ฝ๋๊ฐ ๋์์ INSERT ๋๋๋ผ๋ ์ค๋ณต๋์ง ์๊ณ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ์ผ๋ จ๋ฒํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ํ ์ด๋ธ ์์ค์ ์ ๊ธ์ธ ์๋ ์ฆ๊ฐ ๋ฝ์ ์ฌ์ฉํ๋ค. ํด๋น ๋ฝ์ ํธ๋์ญ์ ๊ณผ ๊ด๊ณ์์ด INSERT๋ REPLACE ๋ฌธ์ฅ์์ AUTO_INCREMENT ๊ฐ์ ๊ฐ์ ธ์ค๋ ์๊ฐ์ ๋ฝ์ด ๊ฑธ๋ฆฐ๋ค. ์๋ ์ฆ๊ฐ ๋ฝ์ ํ ์ด๋ธ์ 1๊ฐ๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ํ ์ฟผ๋ฆฌ์์ ๋ฝ์ ํ๋ํ์ฌ ์ฑ๋ฒ์ค์ด๋ผ๋ฉด ๋ค์ ์ฟผ๋ฆฌ๋ ๋ฝ์ ๋๊ธฐํด์ผ ํ๋ค. ํ์ง๋ง ์์ฃผ ์งง์ ์๊ฐ๋ง ๊ฑธ๋ ธ๋ค๊ฐ ์ฆ์ ํด์ ๋๋ฏ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.์๋ ์ฆ๊ฐ ๋ฝ์ ์ ๊ธ์ ์ต์ํํ๊ธฐ ์ํด ํ ๋ฒ ์ฆ๊ฐํ๋ฉด ์ ๋ ์๋์ผ๋ก ์ค์ด๋ค์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ค๋ช ํ์๋ฏ ์ด๋ ํธ๋์ญ์ ๊ณผ๋ ๋ฌด๊ดํ๋ค. ๋ฐ๋ผ์ ์๋ ์ฆ๊ฐ๊ฐ ์ฑ๋ฒ์ ์ฑ๊ณตํ์์ง๋ง, ์ดํ์ ์ฟผ๋ฆฌ์์ ์คํจํ์ฌ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋์ด๋ ์๋ ์ฆ๊ฐ๊ฐ์ ๋ณต๊ตฌ๋์ง ์๊ณ ๊ทธ๋๋ก ๋จ๋๋ค.
โ๏ธ MySQL์์ง ๋ฝ
๐ ํ ์ด๋ธ ๋ฝ
ํ ์ด๋ธ ๋ฝ์ ๊ฐ๋ณ ํ ์ด๋ธ ๋จ์๋ก ์ค์ ๋๋ ์ ๊ธ์ด๋ฉฐ, ๋ช ์์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ๋ช ๋ น์ผ๋ก ํน์ ํ ์ด๋ธ์ ๋ฝ์ ํ๋ํ๊ณ ๋ฐ๋ฉํ ์ ์๋ค.
LOCK TABLES table_name [ READ ๋๋ WRITE]
UNLOCK TABLES
๐ ๋ค์๋ ๋ฝ
ํ ์ด๋ธ์ด๋ ๋ ์ฝ๋์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ๊ฑฐ๋ ๋ฝ์ด ์๋ ์ฌ์ฉ์๊ฐ ์ง์ ํ ์์์ ๋ฌธ์์ด ๊ฑฐ๋ ๋ฝ์ด๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ WAS ์๋ฒ์์ ํ๋์ DB ์๋ฒ์ ์ ๊ทผํ ๋ ์ํธ ๋๊ธฐํํ๋๋ฐ์ ์ฃผ๋ก ์ฐ์ธ๋ค.
๐ ๋ฉํ๋ฐ์ดํฐ ๋ฝ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ์ด๋ฆ์ด๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝ ํ ๋ ์๋์ผ๋ก ์ป์ด์ง๋ ๋ฝ์ด๋ค. ์ด๋ ๋ช ์์ ์ผ๋ก ์ป์ ์ ์๊ณ ํ ์ด๋ธ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ ๋ ์๋์ ์ผ๋ก ์ป์ด์ง๋ ๋ฝ์ด๋ค.
โ๏ธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
๐ SERIALIZABLE
SELECT์๋ ๋์ ๋ ์ฝ๋์ ๋ฅ์คํธ ํค ๋ฝ์ ๊ณต์ ๋ฝ์ผ๋ก ๊ฑธ์ด ๋ชจ๋ ํธ๋์ญ์ ์ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ๋์์ฑ์ ๋ํ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ฑ๋ฅ์ด ์ข์ง ์๋ค๋ ๋จ์ ์ด ์๋ค.
๐ REPEATABLE READ
๋ณ๊ฒฝ๋ ๋ ์ฝ๋์ ๋ํด์ ์ธ๋ ์์ญ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ํธ๋์ญ์ ๋๋ฒ์ ํจ๊ป ์ ์ฅํ๋ค. ์ด๋ฅผ ํตํด ์ผ๊ด๋ ์ฝ๊ธฐ(Non-Lockong Read)๋ฅผ ์ง์ํ๋ฉฐ ํธ๋์ญ์ ๋กค๋ฐฑ ์ ๋ฐ์ดํฐ ๋ณต๊ตฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ๋ํ InnoDB์์๋ ๊ฐญ๋ฝ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ SELECT<User A> → INSERT<User B> → SELECT FOR UPDATE<User A>๋ฅผ ์ ์ธํ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๐ READ COMMITED
์ปค๋ฐ๋ ๋ ์ฝ๋๋ง ์กฐํ ๊ฐ๋ฅํ๋ฉฐ ํฌํ ๋ฆฌ๋์ ๋๋ถ์ด Non-Repeatable Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ READ UNCOMMITED
์ปค๋ฐํ์ง ์์ ๋ ์ฝ๋๋ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ฉฐ ํฌํ ๋ฆฌ๋, Non-Repeatable Read ๊ทธ๋ฆฌ๊ณ Dirty-Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. Dirty-Read๋ ํ ํธ๋์ญ์ ์์ ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝํ๋ ๊ฒ์ ์๋ฏธํ๋ค.