Optimistic Lock Pessimistic Lock
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ฑ ์ฒ๋ฆฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํด์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋, ๋์์ฑ ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ฐ๋ฆฌ๋ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ์์ค์ ์ค์ ํด์ ์ฒ๋ฆฌํ๋ค.
๋์์ ํ๋์ ๋ฐ์ดํฐ์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ ๊ทผํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
ํ ์ด๋ธ์ row์ ์ ๊ทผ ์ Lock์ ๊ฑธ๊ณ ๋ค๋ฅธ Lock์ด ๊ฑธ๋ ค์์ง ์์ ๊ฒฝ์ฐ์๋ง ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
์์ ํ ๋ ๋ด๊ฐ ๋จผ์ ์ด ๊ฐ์ ์์ ํ๋ค๊ณ ๋ช ์ํ์ฌ ๋ค๋ฅธ ์ฌ๋์ด ๋์ผํ ์กฐ๊ฑด์ผ๋ก ๊ฐ์ ์์ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋น๊ด์ ๋ฝ (Pessimistic Lock)
๋น๊ด์ ๋ฝ์ Repeatable Read ๋๋ Serializable ์ ๋์ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ์ ๊ณตํ๋ค.
๋น๊ด์ ๋ฝ์ ํธ๋์ญ์ ์ด ์์๋ ๋ Shared Lock ๋๋ Exclusive Lock์ ๊ฑธ๊ณ ์์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํธ๋์ญ์ ์ด write๋ฅผ ํ๊ธฐ ์ํด์๋ Exclusive Lock์ ์ป์ด์ผ ํ๋ค.
์ด ๋ Shared Lock์ด ๊ฑธ๋ ค์์ผ๋ฉด Exclusive Lock์ ์ป์ง ๋ชปํด์ ์ ๋ฐ์ดํธ๋ฅผ ํ ์ ์๋ค.
์์ ์ ํ๊ธฐ ์ํด์๋ ํด๋น ํธ๋์ญ์ ์ ์ ์ธํ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋์ด์ผ ํ๋ค.

๋๊ด์ ๋ฝ (Optimistic Lock)
๋๊ด์ ๋ฝ์ ์์ ํ ๋ ์ฝ๊ฒ ๋งํ์๋ฉด ๋ด๊ฐ ๋จผ์ ์ด ๊ฐ์ ์์ ํ๋ค๊ณ ๋ช ์ํ์ฌ ๋ค๋ฅธ ์ฌ๋์ด ๋์ผํ ์กฐ๊ฑด์ผ๋ก ๊ฐ์ ์์ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋ง๋ง ๋ค์ด๋ ์๊ฒ ์ง๋ง ์ด ํน์ง์ DB์์ ์ ๊ณตํด์ฃผ๋ ํน์ง์ ์ด์ฉํ๋ ๊ฒ์ด ์๋๋ผ, Application Level์์ ์ก์์ฃผ๋ Lock์ด๋ค.

A๊ฐ table์ Id 2๋ฒ์ ์ฝ์ ( name = Karol, version = 1 )
B๊ฐ table์ Id 2๋ฒ์ ์ฝ์ ( name = Karol, version = 1 )
B๊ฐ table์ Id 2๋ฒ, version 1์ธ row์ ๊ฐ ๊ฐฑ์ ( name = Karol2, version = 2 ) ์ฑ๊ณต
A๊ฐ table์ Id 2๋ฒ, version 1์ธ row์ ๊ฐ ๊ฐฑ์ ( name = Karol1, version = 2 ) ์คํจ
Id 2๋ฒ์ ์ด๋ฏธ version์ด 2๋ก ์ ๋ฐ์ดํธ ๋์๊ธฐ ๋๋ฌธ์ A๋ ํด๋น row๋ฅผ ๊ฐฑ์ ํ์ง ๋ชปํจ
๋์๋๋ฅผ ๊ธ๋ก ๋ํ๋ด๋ฉด ์์ ๊ฐ๋ค.
์ flow๋ฅผ ํตํด์ ๊ฐ์ row์ ๋ํด์ ๊ฐ๊ธฐ ๋ค๋ฅธ 2๊ฐ์ ์์ ์์ฒญ์ด ์์์ง๋ง 1๊ฐ๊ฐ ์ ๋ฐ์ดํธ ๋จ์ ๋ฐ๋ผ version์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๋ค์ ์์ ์์ฒญ์ ๋ฐ์๋์ง ์๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๋๊ด์ ๋ฝ์ version๊ณผ ๊ฐ์ ๋ณ๋์ ์ปฌ๋ผ์ ์ถ๊ฐํ์ฌ ์ถฉ๋์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ๋ง๋๋ค.
version ๋ฟ๋ง ์๋๋ผ hashcode ๋๋ timestamp๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
๋กค๋ฐฑ Rollback
๊ทธ๋ฐ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ํ ์ด๋ธ์ด 1๊ฐ๊ฐ ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ด๋ฉด ์ด๋ป๊ฒ ํ ๊น?
๋น์ฐํ ํ๋์ ์์ฒญ์ ๋ํด์๋ Rollback์ด ํ์ํ๋ค.
์๋ ๋น๊ด์ ๋ฝ์ ์๋์ฝ๋๋ฅผ ๋ณด์.
์์ ์๋ ์ฝ๋๋ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ฌ์๊ธฐ ๋๋ฌธ์ ์์ ์ด ํ๋ ์คํจํ๋ฉด database ๋จ์์ ์ ์ฒด Rollback์ด ์ผ์ด๋๊ฒ๋๋ค.
๋ง์ฝ theTable์ด ์คํจํ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ ๋ค๋ฉด Transaction์ด ์คํจํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ ์ฒด์ ์๋์ผ๋ก rollback์ด ์ผ์ด๋๊ฒ ๋๋ค.
๋๊ด์ ๋ฝ์ ๊ฒฝ์ฐ๋ ์กฐ๊ธ ๋ค๋ฅผ ์ ์๋ค.
Transaction์ ์ก์ง ์๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์ถฉ๋์ด ๋ฐ์ํ์ฌ ์์ ์ ๋ชปํ ๋ถ๋ถ์ ๋ํด์๋ ๋กค๋ฐฑ์ ๋ํ ์ฑ ์์ Application ๋จ์์ ๋กค๋ฐฑ์ ์๋์ผ๋ก ํด์ค์ผํ๋ค.
๋๊ด์ ๋ฝ์ ํธ๋์ญ์ ์ ํ์๋กํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ์ ์ผ๋ก ๋น๊ด์ ๋ฝ๋ณด๋ค ๋ ์ข๋ค.
์ด ๋ ๊ฐ์ง๊ฐ ๋น๊ด์ ๋ฝ์ ๋นํด ๊ฐ์ง๋ ๋๊ด์ ๋ฝ์ ์ต๋ ๊ฐ์ ์ด๋ค.
ํธ๋์ญ์ ์ ํ์๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ ๋ก์ง์ ํ๋ฆ์ ๊ฐ์ง๋๋ ์ถฉ๋ ๊ฐ์ง๋ฅผ ํ ์ ์๋ค.
๋ง์ฝ ๋น๊ด์ ๋ฝ์ด๋ผ๋ฉด 1๋ฒ์์ 3๋ฒ์ฌ์ด์ ํธ๋์ญ์ ์ ์ ์งํ ์๊ฐ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ๋ณด๋ฅผ ์์ฒญ
์๋ฒ์์๋ ์ ๋ณด๋ฅผ ๋ฐํ
ํด๋ผ์ด์ธํธ์์ ์ด ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์์ ์์ฒญ
์๋ฒ์์๋ ์์ ์ ์ฉ ( ์ถฉ๋ ๊ฐ์ง ๊ฐ๋ฅ )
๋๋ฌธ์ ์ถฉ๋์ด ๋ง์ด ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฌ์ง๋ ๊ณณ์ ์ฌ์ฉํ๋ฉด ์ข์ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์๋ค.
ํ์ง๋ง ๋๊ด์ ๋ฝ์ ์ต๋ ๋จ์ ์ ๋กค๋ฐฑ์ด๋ค.
๋ง์ฝ ์ถฉ๋์ด ๋ฌ๋ค๊ณ ํ๋ค๋ฉด ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๋กค๋ฐฑ์ฒ๋ฆฌ๋ฅผ ํ๋ํ๋ ํด์ค์ผํ๋ค.
๋น๊ด์ ๋ฝ์ด๋ผ๋ฉด ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ฉด ๋๋๋ ์์ ์ด์ง๋ง ๋๊ด์ ๋ฝ์ ๊ทธ๋ ์ง ์๋ค.
์๋์ผ๋ก ๋กค๋ฐฑ์ฒ๋ฆฌ๋ ๊ตฌํํ๊ธฐ๋ ๊น๋ค๋กญ์ง๋ง ์ฑ๋ฅ์ ์ผ๋ก ๋ณด๋๋ผ๋ update๋ฅผ ํ๋ฒ์ฉ ๋ ํด์ค์ผํ๋ค.
๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋น๊ด์ ๋ฝ ๋ณด๋ค ์ข์ง ์์ ์ ์๋ค.
์ด๋ฌํ ๋จ์ ๋๋ฌธ์ ๋๊ด์ ๋ฝ์ ์ถฉ๋์ด ๋ง์ด ์์๋๊ฑฐ๋ ์ถฉ๋์ด ๋ฐ์ํ์ ๋ ๋น์ฉ์ด ๋ง์ด ๋ค๊ฒ์ด๋ผ๊ณ ํ๋จ๋๋ ๊ณณ์์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
Last updated