์๋๋ ์ ์ฝ์ง ๊ณผ์ ์ ๊ธฐ๋กํ ๊ธ์ด๊ณ ํ๋ฆฐ ๋ด์ฉ์ด ํฌํจ๋์ด์์ ์ ์์ต๋๋คโฆ!
๐ย ์๋ฌธ์

์ ๊ฒ์๊ธ์์ ์ ์ํ๋ ์ด์ํ ๊ฐ์ ์ผ๋ก ๋๊ด์ ๋์์ฑ ์ ์ด๋ฅผ ์ ์ฉํ๋ ๊ณผ์ ์์ ๊ต์ฅํ ์ฝ์ง์ ํ๊ณ ์์๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ค.
- ๋น๊ด์ ๋์์ฑ ์ ์ด(Pessimistic Concurrency Control)
- ๋๊ด์ ๋์์ฑ ์ ์ด(Optimistic Concurrency Control)
์ฌ๋ฌ ์ฑ ์์๋ ๋๊ด์ ๋์์ฑ ์ ์ด๋ฅผ ํ์์คํฌํ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐํ๊ณ ์์๋ค. ํ์ง๋ง ์ค์ ๋ก ์ ์ฉํด ๋ณด์๋๋ฐ ๋์์ฑ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์๊ณ , ์ด์ ๋ฅผ ๋ถ์ํ๋ ค๋ค ์คํ๋ ค ๋ฌธ์ ํด๊ฒฐ๊ณผ๋ ์ ์ ๋ฉ์ด์ง๋ ์ด์ํ ๊ฐ์ ์ ํ๊ฒ ๋์๋ค.
๊ตฌ๊ธ๋ง์ ํตํด ๋ค์ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ดค์ง๋ง, ๋๋ถ๋ถ JPA์ @Version์ผ๋ก ํด๊ฒฐํ๊ณ ์์๊ณ MyBatis ์ฌ์ฉ ์ฌ๋ก๋ ์ฐพ๊ธฐ ์ด๋ ค์ ๋ค. ๊ทธ๋ฌ๋ค ์ฐพ๋ค์ฐพ๋ค ๋๋์ด ์ฐ์ฐํ ํ ๋ธ๋ก๊ทธ์์ JPA๊ฐ ์๋๋ผ ๋ด๊ฐ ์ฑ ์์ ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ธ์ ๋ฐ๊ฒฌํ๊ฒ๋์๋ค..!


๋๋ ์ด๋ฏธ ์๋ชป๋ ๊ฐ์ ์ ๊น์ด ๋น ์ ธ ์์ด์ "์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ๋ ๋ฆฌ๊ฐ ์๋ค"๊ณ ์๊ฐํ๋ฉฐ ๋ฐ์ ๋ฐ์ํ๋ฉฐ ์๋์ ์น๊ณ ์๋๋ฅผ ํด๋ณด์๋ค.
์ฌ๊ณ ์๋ ๊ฐ์์ฟผ๋ฆฌ์ INV_QTY >= #{qty}
์กฐ๊ฑด์ ์ถ๊ฐํด ์ค์ ์ฌ๊ณ ์๋์ด ์ถฉ๋ถํ ๋๋ง ์
๋ฐ์ดํธํ๋๋ก ํ๋ค. ๋ณ๊ฒฝ ํ ๊ฒฉ๋ฆฌ ์์ค์ ์๊ด์์ด Repeatable Read์ Read Committed ๋ชจ๋ ๋ฌธ์ ์์ด ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ด ๊ฒฐ๊ณผ๋ ๋ด๊ฐ ์ธ์ด ๊ฐ์ ๊ณผ ์ ํ ๋ฌ๋๊ณ .. ์์์น ๋ชปํ ๊ฒฐ๊ณผ์๋ค. ๋ด ์์์ผ๋ก๋ -1๋ก ๋์์ฑ ๋ฌธ์ ๊ฐ ํด๊ฒฐ์ด ์ ๋์์ด์ผ ํ๋๋ฐ ์ค์ ๋ก๋ 0์ผ๋ก ๋์์ฑ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋ค..
๊ธฐ์กด
<update id="decreaseProdQty" parameterType="Map">
UPDATE prod_opt
SET INV_QTY = INV_QTY - #{qty}
, UPD_DTTM = now()
WHERE OPT_COMB_NO = #{optCombNo}
AND UPD_DTTM = #{updDttm}
</update>
๋ณ๊ฒฝ
<update id="decreaseProdQty" parameterType="Map">
UPDATE prod_opt
SET INV_QTY = INV_QTY - #{qty}
, UPD_DTTM = now()
WHERE OPT_COMB_NO = #{optCombNo}
AND INV_QTY >= #{qty}
</update>
โ ์์ธ ์ถ๋ก & ์๋
1) ์ผ๋จ Repeatable Read๋ก ์๋๋ฆฌ์ค ์ง๋ณด๊ณ ํ ์คํธ
๋ฌธ์ ์ํฉ: ์ฌ๊ณ ์๋ ๊ฒ์ฆ ๋ก์ง์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๊ณ ๊ฐ 1๊ฐ ๋จ์ ์ํ์ ๋ ์ฌ์ฉ์๊ฐ ๋์์ ์ฃผ๋ฌธํ์ ๋ ์ฌ๊ณ ์๋์ด ๋ง์ด๋์ค๊ฐ ๋๋ ํ์
์์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ ๋ ๋ด๊ฐ ์์ํ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ด ์๋๋ฆฌ์ค๋๋ก๋ผ๋ฉด MVCC๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๊ด์ ๋์์ฑ ์ ์ด๊ฐ ์ ๋๋ก ์ ์ฉ๋์ง ์์ ๊ฒฐ๊ณผ๊ฐ -1์ด ๋์ด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ ํต๊ณผ๋๋ ๊ฒ์ผ๊น?
์๊ฐ ์์ | ํธ๋์ญ์ 1 ์ํ | ํธ๋์ญ์ 2 ์ํ |
---|---|---|
1 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ | |
2 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ |
3 | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ INV_QTY(1) >= #{qty}(1) โ ์ฐธ์ด๋ผ ์ฌ๊ณ ์๋์ด ๊ฐ์๋๋ค. ์ฌ๊ณ ์๋: 0๊ฐ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ |
4 | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ ํธ๋์ญ์ 1์์ ์ฌ๊ณ ์๋์ ๋ณ๊ฒฝ์์ผฐ์ง๋ง isolation์ด Repeatable Read์ด๋ฏ๋ก ํธ๋์ญ์ ์์ ์์ ์ค๋ ์ท์ ๊ธฐ์ค์ผ๋ก ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ INV_QTY(1) >= #{qty}(1) โ ์ฐธ์ด๋ผ ํธ๋์ญ์ 2๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ณ ์๋์ด ๊ฐ์๋๋ค. ์ฌ๊ณ ์๋: -1๊ฐ |
5 | ์ปค๋ฐ | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ |
6 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 | ์ปค๋ฐ |
7 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ -1 |
2) ์ฑ , ์๋ฃ ์ฐพ์๋ณด๊ธฐ
MVCC์ ๋ํด ๋์ถฉ ์๊ณ ์์์ด์ update ์์๋ Consistent ๋ชจ๋๊ฐ ์๋ Current ๋ชจ๋๋ก ๊ฐ์ ์์ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์์ง๋ง, where ์ ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ฌ ๋๋ Current ๋ชจ๋๋ก ์ฝ์ด์์ ๊ฐ์ ๋น๊ตํ ๋ค์ ์กฐ๊ฑด์ด ๋ง์กฑํ๋ฉด update๋ฅผ ํ๋ค๋ ์ฌ์ค์ ๋ชฐ๋๋ค.
๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ๋๋ง Current ๋ชจ๋๋ก ์ ๋ฐ์ดํธํ๊ณ , where ์ ์ ๋ฐ์ดํฐ๋ Consistent ๋ชจ๋๋ก ์ฝ์ด์ค๋ ์ค ์์๋ค.
AND INV_QTY >= #{qty}
์กฐ๊ฑด์ ์ฟผ๋ฆฌ ์คํ ์์ ์ ํ์ฌ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ฐ์ํ์ฌ ํ๊ฐ๋๋ค. ์ด๋ UPDATE
์์
์ด Current ๋ชจ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค. MVCC๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ก ์ค๊ณ๋ ๋ฐฉ์์ด๋ค. ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์
์ ์ต์ ์ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ฐ์ํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค.
๊ฒฐ๊ณผ๋ก ์ ์ผ๋ก๋ณด๋ฉด where ์ ์ ๋ช ์๋ ์กฐ๊ฑด์ ํ๊ฐํ ๋ Current ๋ชจ๋๋ก ์ฝ์ด์์ผ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฉ๋์ด ๋๋๋ฐ, ์ดํ์ โ์น์ ํ SQL ํ๋โ์ฑ ์ ์ฐพ์๋ณด๋ update ๋ฌธ์์ where ์ ์ ๋ช ์๋ ์กฐ๊ฑด์ ํ๊ฐํ ๋ ์ค๋ ์ท ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ฒ๋ผ ์ค๋ช ํ๋๋ฐ, ๋ญ๊ฐ ๋ง๋ ๊ฑด์ง ํผ๋์ค๋ฝ๋ค.. ์ด ๋ถ๋ถ์ ๋ ์กฐ์ฌ๊ฐ ํ์ํ๋ค.

์๊ฐ ์์ | ํธ๋์ญ์ 1 ์ํ | ํธ๋์ญ์ 2 ์ํ |
---|---|---|
1 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ | |
2 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ |
3 | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ INV_QTY(1) >= #{qty}(1) โ ์ฐธ์ด๋ผ ์ฌ๊ณ ์๋์ด ๊ฐ์๋๋ค. ์ฌ๊ณ ์๋: 0๊ฐ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ |
4 | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ ํธ๋์ญ์ 1์์ ์ฌ๊ณ ์๋์ ๋ณ๊ฒฝ์์ผ 0์ด๋์๋ค. isolation์ด Repeatable Read์ด๋ฏ๋ก ํธ๋์ญ์ ์์ ์์ ์ค๋ ์ท์ ๊ธฐ์ค์ผ๋ก ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค์ง๋ง, update๋ฏ๋ก Consistent๊ฐ ์๋ Current ๋ชจ๋๋ก ๊ฐ์ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์ค๋ ์ท์์ ์ฝ์ด์จ ๊ฐ์ธ 1์ด ์๋ ์ต๊ทผ ๋ธ๋ก์์ ์ฝ์ด์จ ๋ฐ์ดํฐ. 0์ ์ฝ์ด์ ์กฐ๊ฑด ์ถฉ์กฑ์ด ์ ๋์ด update ์ํX INV_QTY(0) >= #{qty}(1) ์ฌ๊ณ ์๋: 0๊ฐ |
5 | ์ปค๋ฐ | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ |
6 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 | ์ปค๋ฐ |
7 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 |
3) ํท๊ฐ๋ ธ๋ ๋ถ๋ถ2
์๊ฐ ์์ | ํธ๋์ญ์ 1 ์ํ | ํธ๋์ญ์ 2 ์ํ |
---|---|---|
1 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ | |
2 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ |
3 | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ INV_QTY(1) >= #{qty}(1) โ ์ฐธ์ด๋ผ ์ฌ๊ณ ์๋์ด ๊ฐ์๋๋ค. ์ฌ๊ณ ์๋: 0๊ฐ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ |
4 | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ ํธ๋์ญ์ 1์์ ์ฌ๊ณ ์๋์ ๋ณ๊ฒฝ์์ผ 0์ด๋์๋ค. isolation์ด Repeatable Read์ด๋ฏ๋ก ํธ๋์ญ์ ์์ ์์ ์ค๋ ์ท์ ๊ธฐ์ค์ผ๋ก ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค์ง๋ง, update๋ฏ๋ก Consistent๊ฐ ์๋ Current ๋ชจ๋๋ก ๊ฐ์ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์ค๋ ์ท์์ ์ฝ์ด์จ ๊ฐ์ธ 1์ด ์๋ ์ต๊ทผ ๋ธ๋ก์์ ์ฝ์ด์จ ๋ฐ์ดํฐ. 0์ ์ฝ์ด์ ์กฐ๊ฑด ์ถฉ์กฑ์ด ์ ๋์ด update ์ํX INV_QTY(0) >= #{qty}(1) ์ฌ๊ณ ์๋: 0๊ฐ |
5 | ์ปค๋ฐ | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ |
6 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 | ์ปค๋ฐ |
7 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 |
์ฌ๊ธฐ์ ๋ด๊ฐ ์๋ชป ์ดํดํ๋ ๋ถ๋ถ์ด ํ๋ ๋ ์์๋ค. ํธ๋์ญ์ 1์ด ์๊ฐ 3๋ฒ์์ ์ฌ๊ณ ์๋์ ๊ฐ์์ํจ ํ, ํธ๋์ญ์ 2์ ์๊ฐ์์ 4๋ถ๋ถ์์ ๋ฐ๋ก ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ์ค ์์๋๋ฐ ์ด๋ถ๋ถ๋ ํ๋ ธ๋ค.
ํธ๋์ญ์ 1์ด update๋ฅผ ํ๋ ค๊ณ ํ๋ฉด ํด๋น row์ ๋ํ X-Lock(๋ฐฐํ๋ฝ)์ ์ป์ด์ค๊ณ , ์ด ๋ฝ์ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋์ด์ผ ํด์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํธ๋์ญ์ 2๋ ํธ๋์ญ์ 1์ด ์ปค๋ฐํ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ค. DB๊ฐ ๋ฝ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๊ฒฉ๋ฆฌ๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๊ฐ ์์ | ํธ๋์ญ์ 1 ์ํ | ํธ๋์ญ์ 2 ์ํ |
---|---|---|
1 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ | |
2 | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ์ ์ํ ์ฝ๊ธฐ> ์ฌ๊ณ ์๋: 1๊ฐ |
3 | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ INV_QTY(1) >= #{qty}(1) โ ์ฐธ์ด๋ผ ์ฌ๊ณ ์๋์ด ๊ฐ์๋๋ค. ์ฌ๊ณ ์๋: 0๊ฐ | <์ฌ๊ณ ์๋ ๊ฒ์ฆ> ๊ตฌ๋งคํ๋ ค๋ ๊ฐ์: 1๊ฐ ์ฌ๊ณ ์๋: 1๊ฐ โ ํต๊ณผ |
4 | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ | ๋๊ธฐ |
5 | ์ปค๋ฐ | ๋๊ธฐ |
6 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 | <์ฌ๊ณ ์๋ ๊ฐ์> decreaseProdQty๋ฅผ ์คํ ํธ๋์ญ์ 1์์ ์ฌ๊ณ ์๋์ ๋ณ๊ฒฝ์์ผ 0์ด๋์๋ค. isolation์ด Repeatable Read์ด๋ฏ๋ก ํธ๋์ญ์ ์์ ์์ ์ค๋ ์ท์ ๊ธฐ์ค์ผ๋ก ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค์ง๋ง, update๋ฏ๋ก Consistent๊ฐ ์๋ Current ๋ชจ๋๋ก ๊ฐ์ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์ค๋ ์ท์์ ์ฝ์ด์จ ๊ฐ์ธ 1์ด ์๋ ์ต๊ทผ ๋ธ๋ก์์ ์ฝ์ด์จ ๋ฐ์ดํฐ. 0์ ์ฝ์ด์ ์กฐ๊ฑด ์ถฉ์กฑ์ด ์ ๋์ด update ์ํX INV_QTY(0) >= #{qty}(1) ์ฌ๊ณ ์๋: 0๊ฐ |
7 | ๊ทธ ๋ค๋ก ์ฃผ๋ฌธ ๋ก์ง ์์ฑ | |
8 | ์ปค๋ฐ | |
9 | ๊ฒฐ๊ณผ๋ ์ฌ๊ณ ์๋ 0 |
์ด์ฉ์ง ๋ ๊ฐ์ ์ฐ๋ ๋๊ฐ ๋ฉ์๋๋ฅผ ์คํํ ๋๋ง๋ค ์ฐ๋ ๋์ ์ด๋ฆ์ ์ถ๋ ฅํ๋๋ก ํด๋์๋๋ฐ, update๋ฅผ ์คํํ๊ธฐ ์ ๊น์ง๋ ๋ ๊ฐ์ ์ฐ๋ ๋๊ฐ ๊ฑฐ์ ๋์์ ๋ก๊ทธ๊ฐ ์ฐํ์ผ๋, ํ ์ฐ๋ ๋๊ฐ update๋ฅผ ์ํํ์ ๋ ํธ๋์ญ์ ์ฌ์ด์ ์ฝ๊ฐ ์๊ฐ ๊ฐ๊ฒฉ์ด ์๊ฒผ์๋ค. ์ด๋ฐ ํ์์ด ์ฝ๊ฐ ์์ํ์๋๋ฐ ์ ๋ฐ์ดํธ ์ X-Lock์ ๊ฑธ๊ณ , ๊ทธ Lock์ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋๊น์ง ์ง์๋๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ 2๊ฐ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๋ฉด์ ์๊ฐ ๊ฐ๊ฒฉ์ด ์๊ธด ๊ฒ์ด์๋ค.

๐ ๋๊ฐ๋ฉฐ
๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋ ํ์ต์ ํ๋ฉฐ ์กฐ๊ฐ๋ ์ง์๋ค์ด ์๋ก ์ฐ๊ฒฐ๋๋ ๊ฒฝํ์ ํ๋ค. ์ด ๊ณผ์ ์์ ์์ ํ ์ดํดํ๊ณ ์ค์ ๋ก ์ ์ฉํด๋ด์ผ๋ก์จ ๊ฒฝํ์ ํตํด ๋ฐฐ์ฐ๋ ๊ฒ์ ์ค์์ฑ์ ๊นจ๋ฌ์๋ค. ๊ฐ๋ ์ ์ ๋๋ก ์ดํดํ์ง๋ ๋ชปํ๋๋ฐ ๋นจ๋ฆฌ ํด๊ฒฐํ๋ ค๊ณ , ๋น ๋ฅธ ๊ธธ๋ง์ ์ฐพ์ผ๋ ค ํ๋ค ๋ณด๋ฉด ์คํ๋ ค ์๊ฐ์ด ๋ ๊ฑธ๋ฆฐ๋ค๋ ๊ฑธ ์ค๊ฐํ๋ค..
์ ๋๋ก ์์ง๋ ๋ชปํ๋ ์ํ์์ ๋ด ๊ฒฝํ ๊ด๋ จํด ๋ฉด์ ์์ ๊ด๋ จ ์ง๋ฌธ์ ๋ฐ์๋ค๋ฉด ์์ ํ์๊ธฐ์ฒ๋ผ ํํํ ํธ๋ ธ์ ๊ฒ ๊ฐ๋ค..^^
๋ ์์๋ณผ ๊ฒ
Repeatable Read ๊ฒฉ๋ฆฌ ์์ค์ด๊ณ , ๋๊ด์ ๋์์ฑ ์ ์ด๋ก ์ฌ๊ณ ์๋์ด ๋ง์ด๋์ค๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด update ์ where ์ ์ ๋ช ์๋ ์กฐ๊ฑด์ ํ๊ฐํ Consistent๊ฐ ์๋ Current ๋ชจ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ฒ ๋ง๋ ๊ฒ ๊ฐ์๋ฐ..
์น์ ํ SQL ํ๋์ฑ ์์๋ ๋ค๋ฅด๊ฒ ์ค๋ช ํ๊ณ ์์ด ๋ญ๊ฐ ๋ง๋ ๊ฑด์ง ํผ๋์ค๋ฝ๋ค. ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ข ๋ ์๋ฃ๋ฅผ ์ฐพ์๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
Ref
Uploaded by N2T