Lock with Transaction Isolation Level
ํธ๋์ญ์
์ด๋?
ํธ๋์ญ์ ์ด๋, DB์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ์์ ์ ๋จ์์ด๋ค.
ํธ๋์ญ์
์ ์ด๋ก ์ ์ผ๋ก ACID ์์น์ ๋ณด์ฅํด์ผํ๋ค๊ณ ํ๋ค. ํ์ง๋ง ์ด๋ ์ค์ ๋ก ์ข
์ข
์ง์ผ์ง์ง ์๋๋ค. ๊ทธ ์ด์ ๋ ACID ์์น์ strice ํ๊ฒ ์งํค๋ ค๋ฉด ๋์์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ DB ์์ง์ ACID ์์น์ ํฌ์ํ์ฌ ๋์์ฑ์ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ์ ๊ณตํ๋๋ฐ, ๋ฐ๋ก ํธ๋์ญ์
์ isolation level์ด๋ค.
isolation ์์น์ ๋ ์งํค๋ level์ ์ฌ์ฉํ ์๋ก ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์ปค์ง์ง๋ง ๋ ๋์ ๋์์ฑ์ ์ป์ ์ ์๋ค.
Read Uncommitted, Read Committted, Repeatable Read, Serializable
DB ์์ง์ isolation level์ ๋ฐ๋ผ ๋ค๋ฅธ locking ์ ๋ต์ ์ทจํ๋ค.
isolation level์ด ๋์์ง์๋ก ๋ ๋ง๊ณ strickํ๊ฒ lock์ ๊ฑด๋ค.
InnoDB์ Lock
InnoDB๋ ํธ๋์ญ์ ์ ACID ์์น๊ณผ ๋์์ฑ์ ์ต๋ํ ๋ณด์ฅํ๊ธฐ ์ํด์ ์ฌ๋ฌ ์ข ๋ฅ์ lock์ ์ฌ์ฉํ๋ค.
SELECT @@GLOBAL(or SESSION).transaction_isolation์ฟผ๋ฆฌ๋ก ํ์ธ ๊ฐ๋ฅInnoDB์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก
REPEATABLE_READ
row-level lock
๊ธฐ๋ณธ์ ์ธ lock์ ํ
์ด๋ธ์ row๋ง๋ค ๊ฑธ๋ฆฌ๋ row lock์ด๋ค. ์ฌ๊ธฐ์๋ shared-lock๊ณผ exclusive-lock์ด ์๋ค.
Shared-lock & Exclusive lock
ared-lock & Exclusive lock
Shared-lock(S lock)์ read์ ๋ํ lock์ด๋ค.
์ผ๋ฐ์ ์ธ select ์ฟผ๋ฆฌ๋ lock์ ์ฌ์ฉํ์ง ์๊ณ DB์ ๋ ์ฝ๋๋ฅผ ์ฝ๋๋ค. ํ์ง๋ง select โฆ for share ๋ฑ ์ผ๋ถ select ์ฟผ๋ฆฌ๋ read ์์ ์ ์ํํ ๋ InnoDB๊ฐ ๊ฐ row์ S-lock์ ๊ฑด๋ค.
Exclusive-lock(X-lock)์ write์ ๋ํ lock์ด๋ค.
select โฆ for update๋ update, delete ๋ฑ์ ์์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ ๋ ๊ฐ row์ ์ค์ ํ๋ lock์ด๋ค.
๋์ ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ํ๋์ row์ S-lock์ ๊ฑธ ์ ์๋ค. ์ฆ, ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ํ๋์ row๋ฅผ ์ฝ์ ์ ์๋ค.
S-lock์ด ๊ฑธ๋ฆฐ row์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด X-lock์ ๊ฑธ ์ ์๋ค. ์ฆ, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๊ณ ์๋ row๋ฅผ ์์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
X-lock์ด ๊ฑธ๋ ค์๋ row์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด S-lock๊ณผ X-lock ๋๋ค ๊ฑธ ์ ์๋ค. ์ฆ, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์กฐ์ํ๊ณ ์๋ row๋ ์ฝ๊ธฐ, ์์ , ์ญ์ ๊ฐ ์ ๋ถ ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์, S lock์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๋ผ๋ฆฌ๋ ๊ฐ์ row์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง X-lock์ด ๊ฑธ๋ฆฐ row๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ด๋ ํ ์ฟผ๋ฆฌ๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
shared์ exclusive ์ด๋ฆ์ ์๋ฏธ์ ์ ํํ ์ผ์นํ๋ค.
exclusive lock(X-lock)์ด ๊ฑธ๋ฆฌ๋ฉด ํด๋น ๋ ์ฝ๋์ ๋ํด์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ์ ๋ถ ๋ถ๊ฐ๋ฅ
Record lock
Record lock์ row๊ฐ ์๋๋ผ DB index record์ ๊ฑธ๋ฆฌ๋ lock์ด๋ค.
์ฌ๊ธฐ๋ row-level lock๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก S, X-lock์ด ์กด์ฌํ๋ค.
์๋ฅผ๋ค์ด c1์ด๋ผ๋ ์ปฌ๋ผ์ ๊ฐ์ง ํ ์ด๋ธ t1์ด ์๋ค. ์ฌ๊ธฐ์ ํ๋์ ํธ๋์ญ์ ์์ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
๊ทธ๋ฌ๋ฉด t1.c1์ ๊ฐ์ด 10์ธ index์์ X lock์ด ๊ฑธ๋ฆฐ๋ค.
์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๋ฉด,
ํธ๋์ญ์
B์ ์ฟผ๋ฆฌ๋ t1.c1 = 10์ธ index record์ X-lock์ ๊ฑธ๋ ค๊ณ ์๋ํ๋ค. ํ์ง๋ง ํด๋น index record์๋ ์ด๋ฏธ ํธ๋์ญ์
A๊ฐ X-lock์ ๊ฑด ์ํ์ด๋ค. ๋ฐ๋ผ์ ํธ๋์ญ์
B๊ฐ ์คํํ ์ฟผ๋ฆฌ๋ ํธ๋์ญ์
A๊ฐ commit ๋๋ rollback์ด ๋๊ธฐ ์ ๊น์ง t1.c1 = 10 ์ธ row๋ฅผ ์ญ์ ํ ์ ์๋ค.
delete ์ฟผ๋ฆฌ ๋ฟ๋ง ์๋๋ผ, insert, update ์ฟผ๋ฆฌ๋ ๋์ผํ๋ค.
์ ๋ฆฌ:
select โฆ for update
์ง์ ๋ ๋ ์ฝ๋์ ๋ํด ๋ฒ ํ์ ์ ๊ธ(exclusive lock)์ ์ค์
๋ค๋ฅธ ํธ๋์ญ์ ์ ํด๋น ๋ ์ฝ๋๋ ์ฝ์ ์ ์์ง๋ง, ์์ ์ ๋ถ๊ฐ๋ฅ
์ ๊ธ์ ํธ๋์ญ์ ์ด commit, rollback ๋ ๋๊น์ง ์ ์ง
record lock์ ๋ค๋ฅธ ์์
update, delete, insert ํด๋น ๋ ์ฝ๋๋ฅผ ์์ ํ๋ ค๊ณ ํ ๋ ์ ๊ธ์ด ์์ฑ
mysql์ isolation level์ด read committed๋ก ์ค์ ๋์ด ์๋ค๋ฉด, inset, delete, update ์ฟผ๋ฆฌ์๋ ์๋์ผ๋ก exclusive lock์ด ์ค์ ๋๋ค.
Gap lock
Gap lock์ DB index record์ gap์ ๊ฑธ๋ฆฌ๋ lock์ด๋ค.
์ฌ๊ธฐ์ gap์ index ์ค, DB์ ์ค์ record๊ฐ ์๋ ๋ถ๋ถ์ด๋ค.
๋ง์ฝ, id ์ปฌ๋ผ๋ง ์กด์ฌํ๋ ํ ์ด๋ธ์ด ์๊ณ , id ์ปฌ๋ผ์ index๊ฐ ๊ฑธ๋ ค์๋ค๊ณ ํ๋ฉด, ํ์ฌ ํ ์ด๋ธ์๋ id = 3์ธ row์ id = 7์ธ row๊ฐ ์๋ค.
๊ทธ๋ฌ๋ฉด DB์ index table์ ๋ค์๊ณผ ๊ฐ์ ์ํ์ด๋ค.
์ด ๊ฒฝ์ฐ ํ์ฌ id โค 2, 4 โค id โค 6, 8 โค id์ ํด๋นํ๋ ๋ถ๋ถ์๋ index record๊ฐ ์๋ค. ์ด ๋ถ๋ถ์ด ๋ฐ๋ก index record์ gap์ด๋ค.
gap lock์ ์ด๋ฌํ gap์ ๊ฑธ๋ฆฌ๋ lock์ด๋ค. ์ฆ, gap lock์ ํด๋น gap์ ์ ๊ทผํ๋ ค๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ์ ์ ๊ทผ์ ๋ง๋๋ค.
record lock์ด ํด๋น index๋ฅผ ํ๋ ค๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ์ ์ ๊ทผ์ ๋ง๋๊ฒ๊ณผ ๋์ผํ๋ค. ๋์ ์ฐจ์ด๋ผ๋ฉด record lock์ ์ด๋ฏธ ์กด์ฌํ๋ row๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ๋ณดํธํ๋ ๊ฒ์ด๊ณ , gap lock์ ์กฐ๊ฑด์ ํด๋นํ๋ ์๋ก์ด row๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํจ์ด๋ค.
์๋ฅผ๋ค์ด c1์ด๋ผ๋ ์ปฌ๋ผ์ด ์กด์ฌํ๋ ํ
์ด๋ธ t1์ด ์๋ค. ์ฌ๊ธฐ์๋ c1 = 13, c1 = 17์ด๋ผ๋ ๋ row๊ฐ ์กด์ฌํ๋ค.
์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๋ฉด, t1.c1์ ๊ฐ์ด 10๊ณผ 20 ์ฌ์ด์ธ gap์ lock์ด ๊ฑธ๋ฆฐ๋ค. ์ฆ, 10 โค id โค 12, 14 โค di โค 16, 18 โค id โค 20์ ํด๋นํ๋ gap์ lock์ด ๊ฑธ๋ฆฐ๋ค.
์ด ์ํ์์ ๋ค๋ฅธ ํธ๋์ญ์
์ด t1.c1 = 15์ธ row๋ฅผ ์ฝ์
ํ๋ ค๊ณ ํ๋ฉด gap lock ๋๋ฌธ์ ํธ๋์ญ์
A๊ฐ commit ๋๊ฑฐ๋ rollback ๋๊ธฐ ์ ๊น์ง ์ฝ์
๋์ง ์๋๋ค. insert์ update, delete ์ฟผ๋ฆฌ์์๋ ๋์ผํ๋ค.
Gap์ ํ๋์ index ๊ฐ์ผ ์๋, ์ฌ๋ฌ index์ ๊ฐ์ผ ์๋, ์์ ์๋ฌด ๊ฐ๋ ์์ ์๋ ์๋ค.
Lock์ด ํด์ ๋๋ ํ์ด๋ฐ
ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์ InnoDB ์์ง์ ์์ฒ๋ผ ์คํ๋๋ ์ฟผ๋ฆฌ์ ๋ง๋ ์๋ง์ lock์ DB์ ๊ฑธ๊ฒ ๋๋ค.
์ด๋ฌํ lock์ ๋ชจ๋ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๊ฑฐ๋ ๋กค๋ฐฑ๋ ๋ ํจ๊ป unlock๋๋ค.
Consistent Read
Consistent read๋ read operation์ ์ํํ ๋, ํ์ฌ DB์ ๊ฐ์ด ์๋ ํน์ ์์ ์ DB Snapshot์ ์ฝ์ด์ค๋ ๊ฒ์ด๋ค.
์ด ์ค๋ ์ท์ commit๋ ๋ณํ๋ง์ด ์ ์ฉ๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
Consistent read๋ ์ด๋ค ๋ฐฉ๋ฒ์ ํตํด ์ด๋ฃจ์ด์ง๊น?
๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ์ฝ์ด์จ row์ lock์ ๊ฑธ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ค. ํ์ง๋ง InnoDB ์์ง์ consistent read๋ฅผ ํ๊ธฐ ์ํด lock์ ์ฌ์ฉํ์ง ์๋๋ค. ์๋ํ๋ฉด ๋์์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
InnoDB ์์ง์ ์คํํ๋ ์ฟผ๋ฆฌ์ log๋ฅผ ํตํด consistent read๋ฅผ ์ง์ํ๋ค. InnoDB ์์ง์ ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋๋ง๋ค ์คํํ ์ฟผ๋ฆฌ์ log๋ฅผ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ค์ consistent read๋ฅผ ํ ๋, ์ด log๋ฅผ ํตํด ํน์ ์์ ์ DB Shapshot์ ๋ณต๊ตฌํด์ ๊ฐ์ ธ์จ๋ค.
์ด ๋ฐฉ์์ ๋น๋ก ๋ณต๊ตฌ ๋น์ฉ์ด ๋ฐ์ํ๊ธฐ๋ ํ์ง๋ง lock์ ์ฌ์ฉํ๋ ๋ฐฉ์๋ณด๋ค ๋์ ๋์์ฑ์ ์ป์ ์ ์๋ค.
Isolation Level
Reapeatable Read
repeatable read๋ ๋ฐ๋ณตํด์ read operation์ ์ํํ๋๋ผ๋ ์ฝ์ด ๋ค์ด๋ ๊ฐ์ด ๋ณํํ์ง ์๋ ์ ๋์ isolation์ ๋ณด์ฅํ๋ level์ด๋ค.
repeatable read ํธ๋์ญ์ ์ ์ฒ์์ผ๋ก read(select) operation์ ์ํํ ์๊ฐ์ ๊ธฐ๋กํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ดํ์ ๋ชจ๋ read operation๋ง๋ค ํด๋น ์์ ์ ๊ธฐ์ค์ผ๋ก consistent read๋ฅผ ์ํํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ค๋ฅธ ํธ๋์ญ์ ๋์ค ๋ค๋ฅธ ํธ๋์ญ์ ์ด commit์ด ๋๋๋ผ๋ ์๋ก์ด commit๋ ๋ฐ์ดํฐ๋ ๋ณด์ด์ง ์๋๋ค. ์ฒซ read ์์ ์ค๋ ์ท์ ๋ณด๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋ฐ์ ์ธ non-locking select ์ธ์ lock์ ์ฌ์ฉํ๋ select, update, delete ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋, repeatable read ํธ๋์ญ์ ์ gap lock์ ์ฌ์ฉํ๋ค. ์ฆ, ๋ด๊ฐ ์กฐ์ํ๋ ค๋ row์ ํ๋ณด๊ตฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฑด๋ค์ง ๋ชปํ๋๋ก ํ๋ค.
์ฌ๊ธฐ์ ๋ํด์๋ Repeatable read vs read commited๋ฅผ ๋น๊ตํค๋ด์ผ ํ๋ค.
Gap lock ๋ฟ๋ง ์๋๋ผ next-key lock ์ญ์ ํ์ฉํ๋ค. ๋ํ unique index์ unique search condition์ ๊ฐ์ง ์ฟผ๋ฆฌ์ ๋ํด์๋ gap lock์ ๊ฑธ์ง ์๋๋ค. ๋ค๋ฅธ ๋ง๋ก ํํํ์๋ฉด, where ์กฐ๊ฑด๋๋ก index๋ฅผ ํ์ ๋ ๋ฐ๋์ row๊ฐ ํ๋ ์ดํ๋ง ๊ฑธ๋ฆด ์ ์๋ ์ฟผ๋ฆฌ์ ๋ํด์๋ gap lock์ ๊ฑธ์ง ์๋๋ค. ์ด์ฐจํผ row์ ํ๋ณด๊ตฐ์ด ํ๋ ์ดํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ฆฌ:
ํธ๋์ญ์ ๋ด ์ฒซ ์ฝ๊ธฐ ์์ ์์ ์์ ์ค๋ ์ท์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ phantom read๊ฐ ๋ฐ์ํ์ง ์์
Gap lock ์ฌ์ฉ (๋จ, unique index์ unique search condition์๋ ๋ฏธ์ฌ์ฉ)
Read Committed
Read committed๋ commit๋ ๋ฐ์ดํฐ๋ง ๋ณด์ด๋ ์์ค์ isolation์ ๋ณด์ฅํ๋ level์ด๋ค.
Repeatable read์ ํธ๋์ญ์ ์ด ์ฒซ read operation์ ๊ธฐ์ค์ผ๋ก consistent๋ฅผ ์ํํ๋ ๋ฐ๋ฉด, Read committed์ ํธ๋์ญ์ ์ read operation ๋ง๋ค DB Snapshot์ ๋ค์ ๋ฌ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด commit์ ์ํํ ๋ค์์ ๋ค์ read operation์ ์ํํ๋ฉด, Repeatable read์ ๋ค๋ฅด๊ฒ read committed์ ํธ๋์ญ์ ์ ํด๋น ๋ณํ๋ฅผ ๋ณผ ์ ์๋ค.
์ด ๋ง์ select ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋, ์ค๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด commit ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋จ์ ์ผ๋ก๋ ํธ๋์ญ์ ๋ด์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ์๋ฒฝํ๊ฒ ๋ณด์ฅ๋์ง ์์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
โcommit ๋ ๋ฐ์ดํฐ๋ง ๋ณด๋ ๊ฑด ๋น์ฐํ๊ฑฐ ์๋๊ฐ?โ ํน์ โselect ์ฟผ๋ฆฌ๋ง๋ค ์ค๋ ์ท์ ๋ค์ ๋จ๋ฉด ๋ค์ read์์ ๋ณต๊ตฌ๊ฐ ํ์ ์๋๋ฐ ์ค๋ ์ท์ ์ ๋จ๋๊ฑฐ์ผ?โ ๋ผ๊ณ ํ ์ ์๋ค.
์ค์ DB์๋ ์์ง commit ๋์ง ์์ ์ฟผ๋ฆฌ๋ ์ ์ฉ๋ ์ํ์ด๋ค. ๋ฐ๋ผ์ commit ๋ ๋ฐ์ดํฐ๋ง ์ฝ์ด์ค๊ธฐ ์ํด์๋ ์์ง commit ๋์ง ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ณต๊ตฌํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
์ฆ, consistent read๋ฅผ ์ํํด์ผ ํ๋ค.
์ผ๋ฐ์ ์ธ non-locking select ์ธ์ lock์ ์ฌ์ฉํ๋ select, update, delete ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋, read committed์ ํธ๋์ญ์ ์ record lock๋ง ์ฌ์ฉํ๊ณ gap lock์ ์ฌ์ฉํ์ง ์๋๋ค.
๋ฐ๋ผ์ phantom read๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ ๋ฆฌ:
Read Committed ํธ๋์ญ์ ์์๋ ๊ฐ ์ฝ๊ธฐ ์์ ๋ง๋ค ์๋ก์ด ์ค๋ ์ท์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ํธ๋์ญ์ ๋ด์์ ์ฌ๋ฌ ์ฝ๊ธฐ๊ฐ ์๋๊ฒฝ์ฐ, ๊ฐ ์ฝ๊ธฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค. (ํฌํ ๋ฆฌ๋)
Gap lock ๋ฏธ์ฌ์ฉ, record lock๋ง ์ฌ์ฉ
Repeatable Read vs Read Committed
์๋๋ Phantom read๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด๋ค.
c1 ์ปฌ๋ผ์ด ์กด์ฌํ๋ ํ
์ด๋ธ t1์ด ์๋ค. ํ์ฌ t1์๋ t1.c1 = 13์ธ row์ t1.c1 = 17์ธ row๊ฐ ์กด์ฌํ๋ค. ์ฌ๊ธฐ์ Read Committed์ธ ํธ๋์ญ์
A์ B๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
๋ ํธ๋์ญ์ ์ ์์ ๊ฐ์ ์์๋ก ์คํ๋๋ค.
(A-1) ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ๋ ๋น์ฐํ t1.c1 = 13์ธ row์ t1.c1 = 17์ธ row 2๊ฐ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด lock์ ์ด๋ป๊ฒ ๊ฑธ๋ ค์์๊น?
Read committed ํธ๋์ญ์
์ record lock๋ง ๊ฑธ๊ณ gap lock์ ์ฌ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ (A-1)๋ฒ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ์งํ ๊ฑธ๋ ค์๋ lock์ t1.c1 = 13๊ณผ t1.c1 = 17 ์ ๋ํ record lock์ด๋ค.
for update๋ ์ ํ๋ ํ์ ๋ํ์ฌ ๋ฒ ํ์ ์ ๊ธ(exclusive lock)์ ๊ฑธ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
์ด ๋ ํธ๋์ญ์ B๊ฐ t1.c1 = 15์ธ row๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํ๋ค. (B-1)
ํธ๋์ญ์ A๋ gap lock์ ๊ฑธ์ง ์์๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ B๋ ์์ ๋กญ๊ฒ t1.c1 = 15์ธ row๋ฅผ ์ฝ์ ํ ์ ์๋ค. ์ด ์ํ์์ ํธ๋์ญ์ B๋ commit์ ์งํํ๋ค. (B-2)
๋ค์ ํธ๋์ญ์
A๊ฐ (A-2) ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค. ๊ทธ๋ฌ๋ฉด ํธ๋์ญ์
A์ Isolation level์ Read committed ์ด๊ธฐ ๋๋ฌธ์ ์๋กญ๊ฒ shapshot์ ๊ฐฑ์ ํด์จ๋ค. ์ฌ๊ธฐ์ ํธ๋์ญ์
B๊ฐ ์ฝ์
ํ t1.c1 = 15์ธ row๋ฅผ ์ฝ์ด ๋ค์ธ๋ค. ์ด๊ฒ์ด ๋ฐ๋ก phantom row์ด๋ค.
์ด ์ํฉ์ด phantom read์ธ ์ด์ ๋, ํธ๋์ญ์ A(๊ฐ์ ํธ๋์ญ์ ) ๋ด์์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์คํํ์ ๋, (A-1), (A-2)์ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋ ๋ฒ์งธ ์คํ ๊ฒฐ๊ณผ์์ ์ฒ์์ ์๋ ๋ ์ฝ๋๊ฐ ๋ํ๋ฌ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ ํธ๋์ญ์
A์ Isolation level์ด Repeatable read๋ผ๊ณ ํ๋ฉด, (B-1) ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋, t1.c1 = 15์ธ gap์ gap lock์ด ๊ฑธ๋ ค์์ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ํธ๋์ญ์
B๋ ํธ๋์ญ์
A๊ฐ commit ๋์ด lock์ ํด์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ , phantom read๋ ์ผ์ด๋์ง ์๋๋ค. ์ฆ, ์
๋ฐ์ดํธ ํ๋ ค๋ 10 โค t1.c1 โค 20์ ํด๋นํ๋ row์ ํ๋ณด๊ตฐ์ด ๋ณํ๋ฅผ ์ผ์ผํค์ง ์๋๋ค.
Read Uncommited
Read Uncommitted ํธ๋์ญ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก Read committed ํธ๋์ญ์ ๊ณผ ๋์ผํ๋ค.
๋์ , select ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์์ง commit ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค.
ํธ๋์ญ์ A์์ row๋ฅผ ์ฝ์
read uncommitted ํธ๋์ญ์ B๊ฐ ํด๋น row๋ฅผ ์ฝ๋๋ค.
ํธ๋์ญ์ A๊ฐ rollback ๋๋ค.
์ด ๊ฒฝ์ฐ, ํธ๋์ญ์
B๋ ์ค์ ๋ก DB์ ํ ๋ฒ๋ commit ๋์ง ์์, ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์๋ค. ์ด๋ฌํ ํ์์ Dirty Read๋ผ๊ณ ํ๋ค.
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ InnoDB ์์ง์ด ํธ๋์ญ์ ์ commit ํ๋ ๋ฐฉ๋ฒ ๋๋ฌธ์ด๋ค.
InnoDB ์์ง์ ์ผ๋จ ์คํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ DB์ ์ ์ฉํ๋ค. ๊ทธ๊ฒ์ด ์์ง commit ๋์ง ์์ ํธ๋์ญ์ ์ด์ด๋ ์ ์ฉํ๋ค. ์ฆ, ํน๋ณํ log๋ฅผ ๋ณด๊ณ ํน์ ์์ ์ snapshot์ ๋ณต๊ตฌํ๋ consistent read๋ฅผ ํ์ง ์๊ณ ๊ทธ๋ฅ ํด๋น ์์ ์ DB๋ฅผ ์ฝ์ผ๋ฉด dirty read๊ฐ ๋๋ค.
Serializable
Serializable ํธ๋์ญ์
์ ๊ธฐ๋ณธ์ ์ผ๋ก repeatable read์ ๋์ผํ๋ค. ๋์ ์ select ์ฟผ๋ฆฌ๊ฐ ์ ๋ถ select โฆ for share๋ก ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
์ด๋ repeatable read์์ ๋ง์ ์ ์๋ ๋ช ๊ฐ์ง ์ํฉ์ ๋ฐฉ์งํ ์ ์๋ค.
๋จผ์ , (A-1)๋ฒ select ์ฟผ๋ฆฌ๊ฐ select โฆ for share๋ก ๋ฐ๋๋ฉด์ id = 1 ์ธ row์ S-lock์ด ๊ฑธ๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ (B-1)๋ฒ select ์ฟผ๋ฆฌ ์ญ์ id = 1 ์ธ row์ S-lock์ ๊ฑด๋ค. ์ด ์ํฉ์์ ํธ๋์ญ์
A์ B๊ฐ ๊ฐ๊ฐ 2๋ฒ์ update ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๊ณ ํ๋ฉด, row์ X-lock์ ๊ฑธ๋ ค๊ณ ์๋ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ฏธ ํด๋น row์๋ S-lock์ด ๊ฑธ๋ ค์๊ธฐ ๋๋ฌธ์ deadlock ์ํฉ์ ๋น ์ง๊ณ , ๋ ํธ๋์ญ์
๋ชจ๋ timeout์ผ๋ก ์คํจํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ money๋ 1๋ก ์์ ํ๊ฒ ๋จ์์๋ค.
์ด ๊ฒฝ์ฐ๋ก ๋ดค์ ๋, Serializable isolation level์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ ์ ์์ง๋ง, ๊ต์ฅํ ์ฝ๊ฒ deadlock์ ๊ฑธ๋ฆด ์ ์๋ค. ๋ฐ๋ผ์ ํด๋น ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์๋์ง ์ ์คํ๊ฒ ํ์ ํ๊ณ ์ฌ์ฉํด์ผ ํ๋ค.
Serializable์ด ์๋๋ฉด update, delete์ ์ฃผ์ํด๋ผ.
ํ๋ ์ฃผ์ํด์ผ ํ ๋ถ๋ถ์ DML, ์ฆ update๋ delete๋ consistent read์ ์ ์ฉ์ ๋ฐ์ง ์๋๋ค.
์ฆ, ๊ฐ์ where ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ๋๋ผ๋, ์์ ํ๋ ค๊ณ select ์ฟผ๋ฆฌ๋ก ์ฝ์ด์จ row์ ํด๋น row๋ค์ ์์ ํ๊ธฐ ์ํด update ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ์ ๋ ์ค์ ๋ก ์์ ๋๋ row๊ฐ ๋ค๋ฅผ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ repeatable read ํธ๋์ญ์
์ด ์คํ๋๋ค๊ณ ํ์.
๋ ํธ๋์ญ์
์ด ์์ ๊ฐ์ ์์๋ก ์คํ๋ ๋, ์ฒ์์ ํ
์ด๋ธ t1์ด ๋น์ด์๋ค๋ฉด (A-1)๋ฒ ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๋ 0์ด๋ค. ์ด ๋ ์คํ๋ ์ฟผ๋ฆฌ๋ non-locking select ์ฟผ๋ฆฌ์ด๋ฏ๋ก lock์ ๊ฑธ๋ ค์์ง ์๋ค.
๋๋ถ์ ํธ๋์ญ์
B๋ ์์ ๋กญ๊ฒ t1.c1 = โxyzโ์ธ row๋ฅผ ์ฝ์
ํ ์ ์๋ค. ๋ฐ๋ผ์ (A-1)๋ฒ ์ฟผ๋ฆฌ์์ t1.c1 = โxyzโ์ธ row๊ฐ 0๊ฐ ์๊ณ , ๊ฐ์ where ์กฐ๊ฑด์ผ๋ก delete ์ฟผ๋ฆฌ๋ฅผ ์คํํ์์๋ (A-2)๋ฒ ์ฟผ๋ฆฌ๋ 3๊ฐ์ row๋ฅผ ์ญ์ ํ๋ค.
๋ง์ฝ ์ ์ํฉ์ฒ๋ผ consistent read์๋ ๋ณด์ด์ง ์๋ row์ update์ delete ์ฟผ๋ฆฌ๋ก ์ํฅ์ ์ค ๊ฒฝ์ฐ, ๊ทธ ์์ ์ดํ๋ก๋ ํด๋น row๊ฐ ํธ๋์ญ์ ์์ ๋ณด์ด๊ธฐ ์์ํ๋ค.
ํธ๋์ญ์ B๊ฐ c1 = โabcโ ์ธ row๋ฅผ ๋ช ๊ฐ ์ฝ์ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์๊น ์ ์์์ ๋์ผํ๊ฒ (A-2)๋ฒ ์ฟผ๋ฆฌ๋ (A-1) ์ฟผ๋ฆฌ์์ ๋ณด์ด์ง ์์๋ row๋ฅผ ์์ ํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ด ์๊ฐ๋ถํฐ ํธ๋์ญ์ A์์๋ ์ด row๋ค์ด ๋ณด์ด๊ธฐ ์์ํ๋ค. ๋ฐ๋ผ์ (A-3)์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ 3์ด ๋๋ค.
๋ง์ฝ ๋ ์์์์ transaction isolation level์ด serializable ์ด์๋ค๋ฉด ์ด๋จ๊น?
์์ ๋ชจ๋ select ์ฟผ๋ฆฌ๋ select โฆ for share๋ก ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ค. ๋ฐ๋ผ์ ๋ ์์ ๋ชจ๋์์ (A-1)๋ฒ ์ฟผ๋ฆฌ๋ record S-lock์ ๊ฑธ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํธ๋์ญ์
B์์ update ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ X-lock์ ๊ฑธ๋ ค๊ณ ํ ๋, ์ด๋ฏธ ํด๋น record์๋ S-lock์ด ๊ฑธ๋ ค์์ผ๋ฏ๋ก ์์ ๋์ง ์๊ณ ๋๊ธฐ ์ํ๋ก ๋น ์ง๋ค.*
๋ฐ๋ผ์ ํธ๋์ญ์ A์ (A-2)๋ฒ ์ฟผ๋ฆฌ๋ ์์ ํ๊ฒ (A-1)๋ฒ ์ฟผ๋ฆฌ์์ ๋ณธ row๋ง ์์ ํ๋ค.
* ๋ถ๋ถ์ t1.c1 ์ปฌ๋ผ์ index๊ฐ ๊ฑธ๋ ค์๋ ์ํฉ์ ๊ฐ์ ํ ์ํฉ์ด๋ค. ํ์ง๋ง index๊ฐ ๊ฑธ๋ ค์์ง ์์ ์ปฌ๋ผ์ ๋ํด์ ํ
์คํธ ํ์ ๋์๋ ํธ๋์ญ์
B๊ฐ ๋๊ธฐ ์ํ๋ก ๋น ์ก๋ค. ์ด๋ ๊ฑธ๋ ค์๋ lock์ ํ์ธํด๋ณด๋ฉด ํธ๋์ญ์
A๊ฐ pk ๋๋ฌธ์ ์์ฑ๋ index์ lock์ ๊ฑด ๊ฒ์ด๋ค. ์ถ์ธก์ปจ๋, where ์กฐ๊ฑด์ index๊ฐ ์๋ ์ปฌ๋ผ๋ง ํฌํจ๋ ๋ locking select๋ฅผ ํ ๊ฒฝ์ฐ ํด๋น row์ pk index์ lock์ ๊ฑฐ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
Last updated