Database/SQL

๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ๋งˆ์ฃผ์นœ ๋ฌธ์ œ: ์žฌ๊ณ ์ˆ˜๋Ÿ‰ ๋น„๊ต

์ฑ”๐Ÿป 2024. 2. 12. 19:27

์•„๋ž˜๋Š” ์ œ ์‚ฝ์งˆ ๊ณผ์ •์„ ๊ธฐ๋กํ•œ ๊ธ€์ด๊ณ  ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ!

๐Ÿ‘€ย ์˜๋ฌธ์ 

๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ๋งˆ์ฃผ์นœ ๋ฌธ์ œ๋“ค: ํƒ€์ž„์Šคํƒฌํ”„ ์‚ฝ์งˆ
๊ฒฐ๋ก ๋ฌธ์ œ ์ •์˜๋ถ„์„&์‹œ๋„์‹œ๋„1) ์•ˆ ๋˜๋Š” ์ด์œ ๋ฅผ ๋‚˜๋ฆ„ ๋ถ„์„ํ•ด๋ด„ ใ…‹..์‹œ๋„2) 3) ์œ„ ๊ธ€์„ ํ†ตํ•ด์ž˜๋ชป๋œ ๊ฐœ๋… ๋ฐ”๋กœ์žก๊ณ ๐Ÿ” ์›์ธโœ… ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ๊ฒฐ๋ก ๋ฌธ์ œ ์ •์˜์ฒ˜์Œ์— ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜์˜€์„ ๋•Œ, ์ฒ˜์Œ์— ๊ฐ€์ •์„ Isolation Level์ด Repeatable Read๋กœ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ์ž˜๋ชป๋œ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์–ด์„œ Read Committed๋กœ ๋‚ด๋ ค์•ผ ๋˜๋Š” ์ค„ ์•Œ๊ณ  ์–˜๋ฅผ ์œ„ํ•ด Read Committed๋กœ ๋‚ด๋ฆฌ๋Š” ๊ฑด ๋ง์ด ์•ˆ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋น„๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์˜€๋Š”๋ฐ ใ…Ž,,์ž˜๋ชป๋œ ์ง€์‹์œผ๋กœ ์ž˜๋ชป๋œ ํŒ๋‹จ์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค ใ… ใ… ใ…  JPA๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Version์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋˜๋ฐ, ๋‚˜๋Š” Spring + MyBatis์—ฌ์„œ ์ฟผ๋ฆฌ๋ฌธ์—์„œ CAS(compare-and-set) ๋ฐฉ์‹์œผ๋กœ ๋‚™๊ด€์  ..
https://beppp.tistory.com/127

์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ์ •์˜ํ–ˆ๋˜ ์ด์ƒํ•œ ๊ฐ€์ •์œผ๋กœ ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ต‰์žฅํžˆ ์‚ฝ์งˆ์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋‹ค.

  1. ๋น„๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด(Pessimistic Concurrency Control)
  1. ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด(Optimistic Concurrency Control)

์—ฌ๋Ÿฌ ์ฑ…์—์„œ๋Š” ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ ์šฉํ•ด ๋ณด์•˜๋Š”๋ฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ณ , ์ด์œ ๋ฅผ ๋ถ„์„ํ•˜๋ ค๋‹ค ์˜คํžˆ๋ ค ๋ฌธ์ œ ํ•ด๊ฒฐ๊ณผ๋Š” ์ ์  ๋ฉ€์–ด์ง€๋Š” ์ด์ƒํ•œ ๊ฐ€์ •์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•„๋ดค์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ JPA์˜ @Version์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์—ˆ๊ณ  MyBatis ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ฐพ๊ธฐ ์–ด๋ ค์› ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ฐพ๋‹ค์ฐพ๋‹ค ๋“œ๋””์–ด ์šฐ์—ฐํžˆ ํ•œ ๋ธ”๋กœ๊ทธ์—์„œ JPA๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚ด๊ฐ€ ์ฑ…์—์„œ ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ธ€์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ๋˜์—ˆ๋‹ค..!

[DB] ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด๋„๋ก ํ•œ๋‹ค.
https://chrisjune-13837.medium.com/db-๋™์‹œ์„ฑ-๋ฌธ์ œ-ํ•ด๊ฒฐ๋ฐฉ๋ฒ•-f5e52e2e3

๋‚˜๋Š” ์ด๋ฏธ ์ž˜๋ชป๋œ ๊ฐ€์ •์— ๊นŠ์ด ๋น ์ ธ ์žˆ์–ด์„œ "์ € ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ๋  ๋ฆฌ๊ฐ€ ์—†๋‹ค"๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋ฐ˜์‹ ๋ฐ˜์˜ํ•˜๋ฉฐ ์†๋Š”์…ˆ์น˜๊ณ  ์‹œ๋„๋ฅผ ํ•ด๋ณด์•˜๋‹ค.

์žฌ๊ณ ์ˆ˜๋Ÿ‰ ๊ฐ์†Œ์ฟผ๋ฆฌ์— 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๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ€๋ฉด์„œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด ์ƒ๊ธด ๊ฒƒ์ด์—ˆ๋‹ค.

์นœ์ ˆํ•œ SQL ํŠœ๋‹ p.467

๐Ÿ”œ ๋‚˜๊ฐ€๋ฉฐ

๊ผฌ๋ฆฌ์— ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋Š” ํ•™์Šต์„ ํ•˜๋ฉฐ ์กฐ๊ฐ๋‚œ ์ง€์‹๋“ค์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒฝํ—˜์„ ํ–ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ด„์œผ๋กœ์จ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ฐฐ์šฐ๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€๋„ ๋ชปํ–ˆ๋Š”๋ฐ ๋นจ๋ฆฌ ํ•ด๊ฒฐํ•˜๋ ค๊ณ , ๋น ๋ฅธ ๊ธธ๋งŒ์„ ์ฐพ์œผ๋ ค ํ•˜๋‹ค ๋ณด๋ฉด ์˜คํžˆ๋ ค ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฑธ ์‹ค๊ฐํ–ˆ๋‹ค..

์ œ๋Œ€๋กœ ์•Œ์ง€๋„ ๋ชปํ•˜๋Š” ์ƒํƒœ์—์„œ ๋‚ด ๊ฒฝํ—˜ ๊ด€๋ จํ•ด ๋ฉด์ ‘์—์„œ ๊ด€๋ จ ์งˆ๋ฌธ์„ ๋ฐ›์•˜๋‹ค๋ฉด ์™„์ „ ํƒˆ์ˆ˜๊ธฐ์ฒ˜๋Ÿผ ํƒˆํƒˆํƒˆ ํ„ธ๋ ธ์„ ๊ฒƒ ๊ฐ™๋‹ค..^^

๋” ์•Œ์•„๋ณผ ๊ฒƒ

Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๊ณ , ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋กœ ์žฌ๊ณ ์ˆ˜๋Ÿ‰์ด ๋งˆ์ด๋„ˆ์Šค๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด update ์‹œ where ์ ˆ์— ๋ช…์‹œ๋œ ์กฐ๊ฑด์„ ํ‰๊ฐ€ํ•  Consistent๊ฐ€ ์•„๋‹Œ Current ๋ชจ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ..

์นœ์ ˆํ•œ SQL ํŠœ๋‹์ฑ…์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์–ด ๋ญ๊ฐ€ ๋งž๋Š” ๊ฑด์ง€ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ข€ ๋” ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

Ref

์นœ์ ˆํ•œ SQL ํŠœ๋‹ - ์˜ˆ์Šค24
์ฑ… ์ œ๋ชฉ์€ ํ•„์ž๊ฐ€ ์• ์ฒญํ•˜๋Š” ๋ผ๋””์˜ค ํ”„๋กœ๊ทธ๋žจ โ€˜์†์— ์žกํžˆ๋Š” ๊ฒฝ์ œโ€™ ์ค‘ โ€˜์นœ์ ˆํ•œ ๊ฒฝ์ œโ€™๋ผ๋Š” ์ฝ”๋„ˆ์—์„œ ์ฐฉ์•ˆํ–ˆ๋‹ค. ์–ด๋ ค์šด ๊ฒฝ์ œ ์ด์Šˆ๋ฅผ ์ผ๋ฐ˜์ธ ๋ˆˆ๋†’์ด์— ๋งž๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…ํ•ด ์ฃผ๋Š” ์ง„ํ–‰์ž๋ฅผ ๋ณด๋ฉด์„œ โ€œ๋‚˜๋„ SQL ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ €๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ํ’€์–ด ์„ค๋ช…ํ•˜๋Š” ์ฑ…์„ ์จ์•ผ๊ฒ ๋‹คโ€๋Š” ๋‹ค์ง...
https://www.yes24.com/Product/Goods/61254539

Uploaded by N2T