ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€

2023. 7. 25. 11:25ยท ๐Ÿ‘จโ€๐Ÿ’ป Back End/MySQL
๋ชฉ์ฐจ
  1. (1) ํŠธ๋žœ์žญ์…˜์ด๋ž€
  2. (2) ํŠธ๋žœ์žญ์…˜์˜ 4๊ฐ€์ง€ ํŠน์„ฑ (ACID)
  3. (2-1) Atomicity (์›์ž์„ฑ)
  4. (2-2) Consistency (์ผ๊ด€์„ฑ)
  5. (2-3) Isolation (๊ฒฉ๋ฆฌ์„ฑ)
  6. (2-4) Durability (์ง€์†์„ฑ)
  7. (1) ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ
  8. (1-1) Dirty Read
  9. (1-2) Non-Repeatable Read
  10. (1-3) Phantom Read
  11. (2) DB์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€ [๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ๋ ˆ๋ฒจ]
  12. (2-1) Read Uncommitted - ์ปค๋ฐ‹๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ฝ์Œ
  13. (2-2) Read Committed - ์ปค๋ฐ‹๋œ ๊ฒƒ์„ ์ฝ์Œ
  14. (2-3) Repeatable Read โ€“ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฝ์Œ
  15. (2-4) Serializable Read - ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅ (์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ค„์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋จ)

1) ํŠธ๋žœ์žญ์…˜

 

(1) ํŠธ๋žœ์žญ์…˜์ด๋ž€

  • DB ์—์„œ์˜ ํŠธ๋žœ์žญ์…˜์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋ฅผ ๋งํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ผ๋ จ์˜ ์ž‘์—…๋“ค์„ ํฌํ•จํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์€ ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ•ด์•ผ ํ•œ๋‹ค. โ†’ All or Nothing ์ „๋žต

 

(2) ํŠธ๋žœ์žญ์…˜์˜ 4๊ฐ€์ง€ ํŠน์„ฑ (ACID)

  • DB์—์„œ์˜ ํŠธ๋žœ์žญ์…˜์€ ์•„๋ž˜์˜ 4๊ฐ€์ง€ ํŠน์„ฑ์„ ์ง€๋‹Œ๋‹ค.

 

(2-1) Atomicity (์›์ž์„ฑ)

  • ํŠธ๋žœ์žญ์…˜์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์‹คํ–‰ ๋‹จ์œ„์—ฌ์•ผ ํ•˜๊ณ  ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Statement๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค ํ•˜๋”๋ผ๋„ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ฌถ์ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

  • ํ•˜๋‚˜์˜ ์‹คํ–‰ ๋‹จ์œ„๋ผ๋ฉด ๋‘ ๊ฐœ์˜ ์ƒํƒœ๋กœ ๊ท€๊ฒฐ๋˜๋Š”๋ฐ, ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ์‹คํŒจํ•˜๊ฑฐ๋‚˜์ด๋‹ค. (All or Nothing)

 

  • ์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Statement๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค ํ•˜๋”๋ผ๋„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ธ๋‹ค๋ฉด ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ ์ž‘์—…๋“ค์€ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋ชจ๋‘ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (๋ถ€๋ถ„ ์„ฑ๊ณต / ๋ถ€๋ถ„ ์‹คํŒจ ์—†์Œ)

 

(2-2) Consistency (์ผ๊ด€์„ฑ)

  • ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—… ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฒ˜์Œ์— ํŠธ๋žœ์žญ์…˜์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

(2-3) Isolation (๊ฒฉ๋ฆฌ์„ฑ)

  • ๋‘˜ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ, ์–ด๋–ค ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด๋ผ๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์—ฐ์‚ฐ์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†๋‹ค.

 

  • ์ˆ˜ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์€ ์™„์ „ํžˆ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

 

โ†’ ์ฆ‰, ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

(2-4) Durability (์ง€์†์„ฑ)

  • ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ, ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์†์ ์œผ๋กœ ์ €์žฅ, ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค. (COMMIT)

 

  • ๋น„๋ก ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจ๋˜๋”๋ผ๋„ ๊ทธ ์ƒํƒœ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค. (ROLLBACK)

 

2) ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ (Transaction Isolation)

  • ํŠธ๋žœ์žญ์…˜์˜ ํŠน์„ฑ ์ค‘ ๊ฒฉ๋ฆฌ์„ฑ์— ๋Œ€ํ•ด ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž!

 

  • ์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด, ๊ฒฉ๋ฆฌ์„ฑ์€ โ€œ์‹คํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.โ€๋ผ๊ณ  ํ•˜์˜€์œผ๋‚˜ ๋ง‰์—ฐํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๊ทผ ๋ ˆ๋ฒจ์ด ์กด์žฌํ•˜๊ณ  DB์— ๋”ฐ๋ผ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

  • ์ด๋Ÿฌํ•œ ๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ๋ ˆ๋ฒจ์€ ๊ฐ•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ˜๋Œ€๋กœ ์•ฝํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

  • ์ผ๋‹จ ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์„ ๋จผ์ € ์‚ดํŽด๋ณธ ๋‹ค์Œ ๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

(1) ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

  • ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Dirty Read, Non-Repeatable Read, Phantom Read 3๊ฐ€์ง€์ด๋‹ค.

 

(1-1) Dirty Read

Dirty Read๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ์ˆ˜์ •๋์ง€๋งŒ ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ๋งŒ์•ฝ, Transaction_1์ด ์ •์ƒ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ  Rollback ๋  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ, ๊ทธ ๊ฐ’์„ ์ด๋ฏธ ์ฝ์€ Transaction_2๋Š” ์ž˜๋ชป๋œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋ณธ์ธ์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒํƒœ์— ๋†“์ด๊ฒŒ ๋œ๋‹ค.

 

  • ์ฆ‰, Transaction_2๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ๊นจ์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

(1-2) Non-Repeatable Read

Non-Repeatable Read๋Š” ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๊ฐ™์€ Key๋ฅผ ๊ฐ€์ง„ Row๋ฅผ ๋‘ ๋ฒˆ Read ํ•˜์˜€๋Š”๋ฐ ๊ทธ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.

  • ์ฆ‰, Transaction_2์—์„œ ํŠน์ • Row๋ฅผ 2๋ฒˆ Read ํ•˜๋Š”๋ฐ ๊ทธ ์‚ฌ์ด์— Transaction_1์ด ํ•ด๋‹น Row๋ฅผ Updateํ•˜๊ฑฐ๋‚˜ Delete ํ›„์— Commit ํ•˜๊ฒŒ ๋˜์–ด Transaction_2์—์„œ ๋‹ค์‹œ Read ํ•˜์˜€์„ ๋•Œ, ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

 

(1-3) Phantom Read

ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ•˜์˜€๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์—†๋˜ ์œ ๋ น ๋ ˆ์ฝ”๋“œ (Phantom Record)๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.

  • ์ฆ‰, Transaction_2๊ฐ€ ํŠน์ • ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์œผ๋‚˜ ์ด ๋•Œ, ๋‹ค๋ฅธ Transaction_1์ด ํ•ด๋‹น ์กฐ๊ฑด์˜ ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๊ณ  Commit ํ•˜๊ฒŒ ๋˜์–ด ์•„์ง ๋๋‚˜์ง€ ์•Š์€ Transaction_2๊ฐ€ ํ•ด๋‹น ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด Transaction_1์—์„œ ์ถ”๊ฐ€/์‚ญ์ œํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ๊ป˜ ์กฐํšŒ/๋ˆ„๋ฝ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

  • Phantom Read์™€ Non-Repeatable Read๋ฅผ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ Non-Repeatable Read๋Š” 1๊ฐœ์˜ Row์˜ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๋ฉฐ (Update ๋˜๋Š” Delete), Phantom Read๋Š” ๋‹ค์ˆ˜์˜ ๊ฑด์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

(2) DB์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€ [๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ๋ ˆ๋ฒจ]

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ DataBase์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€ (Transaction Isolation Level)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 

  • ANSI/ISO SQL ํ‘œ์ค€(SQL92)์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์„ฑ๊ณผ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ Trade-Off๋ฅผ ๋‘๊ณ  ๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ 4๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.

 

  • ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋†’์•„์งˆ ์ˆ˜๋ก ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•œ ์ด์Šˆ๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. (Trade-Off ๊ด€๊ณ„)

 

  • ๋˜ํ•œ, ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด DB ๋‚ด๋ถ€์ ์œผ๋กœ DB ๋ฝ(DB Lock)์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋Š”๋ฐ ๋ฝ์— ๋Œ€ํ•ด์„œ๋Š” ๋’ท ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

 

  • ์ฐธ๊ณ ๋กœ DBMS ์ œํ’ˆ๋งˆ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ์ˆ˜์ค€ or Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”ํ•  ์‹œ, ํ•ด๋‹น DB์˜ Document ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์ž

 

  • ํ•ด๋‹น ๋‚ด์šฉ์€ MySQL์„ ํ†ตํ•ด ์‹ค์Šตํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์•„๋ž˜์˜ SQL์„ ํ†ตํ•ด ์‹ค์Šต์šฉ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ์šฉ์ดํ•œ ์‹ค์Šต์„ ์œ„ํ•ด ๋ณ„๋„์˜ ์ œ์•ฝ ์กฐ๊ฑด์€ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
// ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE EMP (
ID INT not null auto_increment,
NAME VARCHAR(100) not null,
JOB VARCHAR(30) not null,
primary key (ID));

// ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
insert into EMP values (1, "userA", 'Student');
insert into EMP values (2, "userB", 'Student');
insert into EMP values (3, "userC", 'Student');

[์ฐธ๊ณ ] ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์กฐํšŒ ๋ฐ ์ˆ˜์ • (MariaDB)

// ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์กฐํšŒ
show variables like 'tx_isolation';

// ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ˆ˜์ •
set tx_isolation = 'READ-UNCOMMITTEDโ€™

// Autocommit ์„ค์ •๊ฐ’ ํ™•์ธ
show variables like 'autocommit%';

// Autocommit ๋„๊ธฐ
SET AUTOCOMMIT = FALSE
  • ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€ ์‹ค์Šต์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ DB ์„ธ์…˜์„ 2๊ฐœ ์—ฐ๊ฒฐํ•ด๋†“๋„๋ก ํ•˜๊ณ  Autocommit ๊ธฐ๋Šฅ์€ ๋„๋„๋ก ํ•œ๋‹ค.

 

(2-1) Read Uncommitted - ์ปค๋ฐ‹๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ฝ์Œ

ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌ ์ค‘์ธ, ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.

  • ์ฆ‰, ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ๋ฐœ์ƒ ๋ฌธ์ œ์  : Dirty Read, Non-Repeatable Read, Phantom Read

 

  • ํ•ด๋‹น ์„ค์ •์€ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅํ•˜๋Š” ์„ค์ •์€ ์•„๋‹ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์— ๋น„ํ•ด ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๊ฐ€์žฅ ๋†’๋‹ค.

 

  • ์ฐธ๊ณ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ Lock์ด ์‚ฌ์šฉ๋˜๋ฉฐ DBMS ๋งˆ๋‹ค ์‚ฌ์šฉ๋˜๋Š” Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
# ์‹ค์Šต 
[์„ธ์…˜ 1, 2 ๊ณตํ†ต]
set tx_isolation = 'READ-UNCOMMITTEDโ€™
SET AUTOCOMMIT = FALSE
START TRNASACTION;

[์„ธ์…˜ 1]
INSERT INTO EMP VALUES (4, โ€œTestโ€, โ€œStudentโ€);

[์„ธ์…˜ 2]
MariaDB [mysql]> SELECT * FROM EMP WHERE ID = 4;
+----+------+---------+
| ID | NAME | JOB     |
+----+------+---------+
|  4 | Test | Student |
+----+------+---------+
1 row in set (0.001 sec)

[์„ธ์…˜ 1]
ROLLBACK;

[์„ธ์…˜ 2]
MariaDB [mysql]> SELECT * FROM EMP WHERE ID = 4;
Empty set (0.000 sec)
  • ์ด์ฒ˜๋Ÿผ ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  (Commit) ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

 

  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ์กฐํšŒ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ 1์—์„œ Rollback์„ ํ†ตํ•ด ์ด์ „์œผ๋กœ ๋Œ๋ฆฌ๊ฒŒ ๋˜๋ฉด ์„ธ์…˜ 2๋Š” ์ด์ „์— ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

  • ๋”ฐ๋ผ์„œ, ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ธ โ€œDirty Readโ€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

(2-2) Read Committed - ์ปค๋ฐ‹๋œ ๊ฒƒ์„ ์ฝ์Œ

ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์–ด ํ™•์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

  • ์ฆ‰, ์ปค๋ฐ‹์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ๋ฐœ์ƒ ๋ฌธ์ œ์  : Non-Repeatable Read, Phantom Read

 

  • ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์‹ค์ œ DB ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ UNDO ๋กœ๊ทธ์— ์žˆ๋Š” ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

 

  • Uncommitted Read ์ˆ˜์ค€์— ๋น„ํ•ด ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง€๋‚˜ Dirty Read๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์—†๋‹ค.

 

  • ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ Non-Repeatable Read์™€ Phantom Read์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

 

  • ์ฐธ๊ณ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ Lock์ด ์‚ฌ์šฉ๋˜๋ฉฐ DBMS ๋งˆ๋‹ค ์‚ฌ์šฉ๋˜๋Š” Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

[์ฐธ๊ณ ] UNDO ๋กœ๊ทธ

  • Mysql, MariaDB์—์„œ ์‚ฌ์šฉ๋˜๋Š” InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํŠธ๋žœ์žญ์…˜์ด Rollback ๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€๋น„ํ•ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „ ๋ ˆ์ฝ”๋“œ๋ฅผ UNDO ๊ณต๊ฐ„์— ๋ฐฑ์—…ํ•ด๋‘๊ณ  ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

  • ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋ฐฉ์‹์„ MVCC (Multi-Version Concurrency Control) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

  • ์ฆ‰, Read-UnCommitted๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฝ์–ด์˜ค๋ฉฐ Read-Committed๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์ผ ๊ฒฝ์šฐ UNDO ๋กœ๊ทธ์—์„œ ์ตœ์‹  UNDO ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ์ •๋ฆฌํ•˜์ž๋ฉด UNDO ๋กœ๊ทธ๋Š” โ€œํŠธ๋žœ์žญ์…˜์˜ ๋กค๋ฐฑ ๋Œ€๋น„์šฉโ€, โ€œํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์œ ์ง€ํ•˜๋ฉฐ ๋†’์€ ๋™์‹œ์„ฑ ์ œ๊ณตโ€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
# ์‹ค์Šต 
[์„ธ์…˜ 1, 2 ๊ณตํ†ต]
set tx_isolation = 'READ-COMMITTED';
SET AUTOCOMMIT = FALSE
START TRNASACTION;

[์„ธ์…˜ 2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME  | JOB     |
+----+-------+---------+
|  1 | userA | Student |
|  2 | userB | Student |
|  3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)

[์„ธ์…˜ 1]
UPDATE EMP SET NAME = โ€˜modifiedโ€™ WHERE ID = 3;

[์„ธ์…˜ 2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME  | JOB     |
+----+-------+---------+
|  1 | userA | Student |
|  2 | userB | Student |
|  3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)

โ†’ Dirty Read ํ˜„์ƒ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[์„ธ์…˜ 1]
COMMIT;

[์„ธ์…˜ 2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+----------+---------+
| ID | NAME     | JOB     |
+----+----------+---------+
|  1 | userA    | Student |
|  2 | userB    | Student |
|  3 | modified | Student |
+----+----------+---------+
3 rows in set (0.000 sec)
  • ์ด์ฒ˜๋Ÿผ ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ Commit์ด ์•ˆ๋๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋กœ ์กฐํšŒ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

  • ๋”ฐ๋ผ์„œ, Dirty Read ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์—ˆ์ง€๋งŒ ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์€ EMP ํ…Œ์ด๋ธ”์˜ ID = 3๋ฒˆ์ธ ROW๋ฅผ ๋‘ ๋ฒˆ SELECT ํ•˜๋Š”๋ฐ ๋‘ ๋ฒˆ์งธ SELECT์„ ํ•˜๊ธฐ ์ „์— ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ํ•ด๋‹น ROW๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  COMMIT ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ์ฒซ ๋ฒˆ์งธ SELECT์™€ ๋‘ ๋ฒˆ์งธ SELECT์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” Non-Repeatable Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

  • ๊ทธ ์™ธ์—๋„ ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ UPDATE๋ฌธ์ด ์•„๋‹Œ INSERT๋ฌธ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด Phantom Read ํ˜„์ƒ ๋˜ํ•œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

 

(2-3) Repeatable Read โ€“ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฝ์Œ

ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‚ญ์ œ, ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ๋Š” UNDO ๋กœ๊ทธ์— ๋„ฃ์–ด๋‘๊ณ , ์•ž์„œ ๋ฐœ์ƒํ•œ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ UNDO ๋กœ๊ทธ์— ์žˆ๋Š” ๋ฐฑ์—… ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋„๋ก ํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ, ๊ฐ’์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ ์ผ์ •ํ•œ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ์™€ ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์— ๋ถˆ์ผ์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋˜ Non-Repeatable Read ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ์ฆ‰, ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•œ ๋ฒˆ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•ด๋„ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ๋ฐœ์ƒ ๋ฌธ์ œ์  : Phantom Read

 

  • ์ฐธ๊ณ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ Lock์ด ์‚ฌ์šฉ๋˜๋ฉฐ DBMS ๋งˆ๋‹ค ์‚ฌ์šฉ๋˜๋Š” Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
# ์‹ค์Šต 
[์„ธ์…˜ 1, 2 ๊ณตํ†ต]
set tx_isolation = 'REPEATABLE-READโ€™
SET AUTOCOMMIT = FALSE
START TRNASACTION;

[์„ธ์…˜ 2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME  | JOB     |
+----+-------+---------+
|  1 | userA | Student |
|  2 | userB | Student |
|  3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)

[์„ธ์…˜ 1]
UPDATE EMP SET NAME = โ€˜modifiedโ€™ WHERE ID = 3;
COMMIT;

[์„ธ์…˜ 2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME  | JOB     |
+----+-------+---------+
|  1 | userA | Student |
|  2 | userB | Student |
|  3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)

[์„ธ์…˜ 1]
INSERT INTO EMP VALUES (4, โ€œTestโ€, โ€œStudentโ€);
COMMIT;

[์„ธ์…˜ 2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME  | JOB     |
+----+-------+---------+
|  1 | userA | Student |
|  2 | userB | Student |
|  3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)

[์„ธ์…˜ 2]
COMMIT;
MariaDB [mysql]> select * from emp;
+----+----------+---------+
| ID | NAME     | JOB     |
+----+----------+---------+
|  1 | userA    | Student |
|  2 | userB    | Student |
|  3 | modified | Student |
|  4 | Test     | Student |
+----+----------+---------+
4 rows in set (0.000 sec)
  • ์ด์ฒ˜๋Ÿผ ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ํŠน์ • ROW์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •(์‚ญ์ œ) + Commit ๋˜์–ด๋„ ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ๋กœ ์กฐํšŒ๊ฐ€ ๋œ๋‹ค.

 

  • ์ฆ‰, ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•œ ๋ฒˆ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•ด๋„ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ๋”ฐ๋ผ์„œ, โ€œRead Committedโ€ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•˜๋˜ Non-Repeatable Read ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค.

 

  • ์ด๋Š” ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •/์‚ญ์ œ + Commit ๋˜๋”๋ผ๋„ ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ UNDO ๋กœ๊ทธ์— ์ €์žฅํ•œ ๋ฐฑ์—… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

  • ๋‹ค๋งŒ, ์„ธ์…˜ 1 ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€(INSERT) ๋ฐ Commit ํ•˜๊ฒŒ ๋˜๋ฉด ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ Phantom Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•˜์ง€๋งŒ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ์ด์šฉํ•˜์—ฌ Phantom Read ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— Phantom Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

(2-4) Serializable Read - ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅ (์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ค„์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋จ)

ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์— ์žˆ๋˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์Œ์€ ๋ฌผ๋ก  ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€๋„ ์•Š๋„๋ก ํ•œ๋‹ค.

  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉด์„œ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” 3๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ์ปค๋ฒ„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€๋ณด๋‹ค ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ํ˜„์ €ํžˆ ๋–จ์–ด์ง„๋‹ค.

 

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ๊ฒฉ๋ฆฌ์„ฑ ์ •์˜ ๊ทธ๋Œ€๋กœ ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ค„์„œ์„œ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

  • ๋‹ค๋งŒ ์ผ๋ฐ˜์ ์ธ DBMS์—์„œ๋Š” Serializable Read ์ˆ˜์ค€์—์„œ๋Š” Phantom Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” DBMS์—์„œ๋Š” Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด Serializable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•  ํ•„์š”์„ฑ์€ ์—†๋‹ค.

 

  • ์ฐธ๊ณ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ Lock์ด ์‚ฌ์šฉ๋˜๋ฉฐ DBMS ๋งˆ๋‹ค ์‚ฌ์šฉ๋˜๋Š” Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
# ์‹ค์Šต 
[์„ธ์…˜ 1, 2 ๊ณตํ†ต]
set tx_isolation = 'SERIALIZABLEโ€™;
SET AUTOCOMMIT = FALSE
START TRNASACTION;

[์„ธ์…˜ 2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME  | JOB     |
+----+-------+---------+
|  1 | userA | Student |
|  2 | userB | Student |
|  3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)

[์„ธ์…˜ 1]
INSERT INTO EMP VALUES (4, โ€œTestโ€, โ€œStudentโ€);

โ†’ ์„ธ์…˜ 2 ํŠธ๋žœ์žญ์…˜์—์„œ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— Lock์„ ๊ฑธ์–ด๋†“์•˜๊ธฐ์— ํ•ด๋‹น INSERT๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

UPDATE EMP SET NAME = โ€˜modifiedโ€™ WHERE ID = 3;

โ†’ UPDATE๋ฌธ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— Lock์ด ๊ฑธ๋ ค์žˆ์–ด ํ•ด๋‹น UPDATE๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

[์ •๋ฆฌ]

  • ์‚ฌ์šฉํ•˜๋Š” DBMS์—์„œ ์–ด๋–ค ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์ œ๊ณตํ•˜๊ณ , ๊ฐ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ธ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค!

 

  • ์œ„์˜ ๊ทธ๋ฆผ์—์„œ Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ InnoDB ์—”์ง„์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, Phantom Read ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

[์ฐธ๊ณ ] ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€๊ณผ DB Lock์˜ ์ƒ๊ด€๊ด€๊ณ„

  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€๊ณผ DB Lock์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์œผ๋กœ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ๋™์‹œ์„ฑ์„ ์กฐ์ ˆํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋˜์–ด์ง„๋‹ค.

 

  • ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€๊ณผ DB Lock์€ ๋น„์Šทํ•œ ๊ฐœ๋…์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

 

โ‘  ๊ฐœ๋…์  ์ฐจ์ด
ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ, ์„œ๋กœ์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์„ค์ •์œผ๋กœ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ํŠธ๋žœ์žญ์…˜๋“ค ๊ฐ„์˜ ๋™์‹œ ์ ‘๊ทผ๊ณผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

DB Lock์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ Lock์€ ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๋“ค์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•จ์œผ๋กœ์จ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

โ‘ก ์ ์šฉ ๋ฒ”์œ„
ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด์— ์ ์šฉ๋˜๋Š” ์„ค์ •์ด๋ฉฐ, ๊ฐ ํŠธ๋žœ์žญ์…˜์€ ์ด ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋™์ž‘ํ•œ๋‹ค.

๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ํŠธ๋žœ์žญ์…˜์˜ ์‹œ์ž‘ ์‹œ์ ์— ์„ค์ •๋˜๋ฉฐ, ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ์ˆ˜ํ–‰ ๋„์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

DB Lock์€ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ์ ์šฉ๋˜๋Š” Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ Lock์„ ํš๋“ํ•˜๊ณ  ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— Lock์„ ํ•ด์ œํ•œ๋‹ค.

 

โ‘ข ์ž๋™๊ด€๋ฆฌ vs ์ˆ˜๋™๊ด€๋ฆฌ
ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์„ค์ •์ด๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฝ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

DB ๋ฝ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด Lock์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค.

 

โ‘ฃ ๋™์‹œ์„ฑ๊ณผ ์ผ๊ด€์„ฑ ๋ณด์žฅ
ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ํŠธ๋žœ์žญ์…˜๋“ค ๊ฐ„์˜ ๋™์‹œ ์ ‘๊ทผ๊ณผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์„ ๋†’์ผ์ˆ˜๋ก ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์€ ๋ณด์žฅ๋˜์ง€๋งŒ ๋™์‹œ์„ฑ์€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DB Lock์€ ๋™์‹œ์„ฑ์„ ๊ด€๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

 

โ†’ ์š”์•ฝํ•˜์ž๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€๊ณผ DB ๋ฝ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋™์‹œ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ด๋‹ค!

 

โ†’ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด์— ์ ์šฉ๋˜๋Š” ์„ค์ •์œผ๋กœ, ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋™์‹œ ์ ‘๊ทผ์„ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•ด DB Lock์„ ์„ค์ •ํ•˜๊ณ  ํ•ด์ œํ•œ๋‹ค.

 

โ†’ DB Lock์˜ ์„ค์ •๊ณผ ํ•ด์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋˜๋Š” DB Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ DBMS๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

โ†’ ์ฆ‰, ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” DB Lock์˜ ์ข…๋ฅ˜์™€ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋ฉฐ ๊ฐ ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์— ์–ด๋–ค DB Lock์„ ์‚ฌ์šฉํ• ์ง€ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์ด ๋†’์„์ˆ˜๋ก ๋” ๊ฐ•๋ ฅํ•œ DB Lock์ด ์‚ฌ์šฉ๋˜๋ฉฐ ๋™์‹œ ์ ‘๊ทผ์ด ์ œํ•œ๋˜๊ณ  ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜์–ด์ง„๋‹ค.

 

โ†’ ๋”ฐ๋ผ์„œ, ์ ์ ˆํ•œ ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ์•Œ์•„์„œ DB Lock์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ๋งŒ ์ ์ ˆํžˆ ์„ ํƒํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์˜ ๋™์‹œ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ์กฐ์ ˆํ•˜๋ฉฐ Lock ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ž‘์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ†’ ๋‹ค๋งŒ, ๋งํ–ˆ๋‹ค์‹œํ”ผ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด์— ์ ์šฉ๋˜๋Š” ์„ค์ •์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋†’์€ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋™์‹œ์„ฑ์ด ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์„ ๊ฐ์•ˆํ•˜์—ฌ ์ ์ ˆํ•œ ๊ฒฉ๋ฆฌ์„ฑ ๋ ˆ๋ฒจ์„ ์„ ํƒํ•˜๊ณ  ํ•„์ˆ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ํ…Œ์ด๋ธ”[๋ฐ์ดํ„ฐ]์— ํ•œํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ DB ๋ฝ์„ ์„ค์ •ํ•œ๋‹ค.

 

[Reference]

https://armful-log.tistory.com/57

 

[DB] ํŠธ๋žœ์žญ์…˜ ํŠน์ง•, ๊ฒฉ๋ฆฌ ์ˆ˜์ค€, ๊ด€๋ จ ๋ฌธ์ œ์ 

_ํŠธ๋žœ์žญ์…˜์ด ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ACID Atomicity(์›์ž์„ฑ) : ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ ์ž‘์—…๋“ค์€ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ๊ฐ„์ฃผ. ๋ชจ๋‘ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋˜์–ด์•ผ ํ•œ๋‹ค. Consistency(์ผ๊ด€์„ฑ) : ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ์ผ๊ด€์„ฑ ์žˆ๋Š”

armful-log.tistory.com

https://luran.me/305

 

DB ํŠธ๋žœ์žญ์…˜ - ๊ฒฉ๋ฆฌ์ˆ˜์ค€(Transaction Isolation Level)

ํŠธ๋žœ์žญ์…˜ DB์—์„œ์˜ ํŠธ๋žœ์žญ์…˜์ด๋ž€, ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์–ด๋–ค ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•œ ๊ฐœ์˜ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋œปํ•˜๋ฉฐ, ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ํ•œ ๊ฐœ ํ˜น์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹คํ–‰๋‹จ์œ„๊ฐ€

luran.me

https://sabarada.tistory.com/117

 

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] ํŠธ๋žœ์žญ์…˜๊ณผ ๊ฒฉ๋ฆฌ์„ฑ

์•ˆ๋…•ํ•˜์„ธ์š”. ํ‰์†Œ์— ํฌ์ŠคํŒ…ํ•˜๋˜ ๋‚ด์šฉ๊ณผ๋Š” ์กฐ๊ธˆ ๋–จ์–ด์ง„ ์ด๋ก ์ ์ธ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. DB๋Š” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์œ ๋ช…ํ•œ All Or Nothing์ด DB์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋‚˜์˜จ ์ด์•ผ๊ธฐ์ž…

sabarada.tistory.com

https://incheol-jung.gitbook.io/docs/q-and-a/db/isolation-level

 

Isolation level - Incheol's TECH BLOG

ํŠธ๋žœ์žญ์…˜(Transaction A) ์ค‘์— ํŠน์ • ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๋‹ค. ์ด๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜(Transaction B)๊ฐ€ ์ ‘๊ทผํ•ด ํ•ด๋‹น ์กฐ๊ฑด์˜ ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ์‚ญ์ œ ๋˜๋Š” ์ถ”๊ฐ€ํ–ˆ์„๋•Œ, ์•„์ง ๋๋‚˜์ง€ ์•Š์€ Transac

incheol-jung.gitbook.io

https://jordy-torvalds.tistory.com/entry/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EA%B3%BC-%EA%B2%A9%EB%A6%AC-%EB%A0%88%EB%B2%A8-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Lock%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

ํŠธ๋žœ์žญ์…˜๊ณผ ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ ๊ทธ๋ฆฌ๊ณ  Lock์— ๋Œ€ํ•˜์—ฌ

* ํ•™์Šต์— ๋„์›€์„ ์ฃผ์‹  ์Šคํ‹ฐ๋””์› ์˜ค๊ธธํ™˜๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜(Transaction) ์œ„ํ‚คํ”ผ๋””์•„์— ์„ค๋ช…ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๋˜๋Š” ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์—์„œ ์ƒํ˜ธ์ž‘์šฉ์˜ ๋‹จ

jordy-torvalds.tistory.com

https://zzang9ha.tistory.com/381

 

[MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

๐Ÿ“Ž ๊ธ€๋˜ 6๊ธฐ ํฌ์ŠคํŒ… 1. ๋ฏธ์น˜๋„๋ก ๋”์› ๋˜ 7์›”์˜ ํšŒ๊ณ  2. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•  ๋•Œ์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ 3. Spring AOP - (1) ํ”„๋ก์‹œ ํŒจํ„ด, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด 4. [MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level) 5

zzang9ha.tistory.com

https://overcome-the-limits.tistory.com/528

 

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] ํŠธ๋žœ์žญ์…˜

๋“ค์–ด๊ฐ€๋ฉฐ SOPT์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, Sequelize ORM์„ ํ™œ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Sequelize๋ฅผ ํ™œ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ, SQL์˜ ์›๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ œ๋Œ€๋กœ ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Sequelize์— ๋ฌธ์ œ๊ฐ€ ์ƒ

overcome-the-limits.tistory.com

- ChatGPT ํฌํ•จ

 
๋ฐ˜์‘ํ˜•

'๐Ÿ‘จโ€๐Ÿ’ป Back End > MySQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

DB Lock ์‹ฌํ™” (์–ด๋ ค์šด ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ์•„....์ž‘์„ฑ์ค‘....)  (0) 2023.07.30
DB Lock ๊ธฐ์ดˆ  (0) 2023.07.30
ํŠธ๋žœ์žญ์…˜ (Transaction)  (0) 2023.07.22
๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด  (0) 2023.07.22
Join (์กฐ์ธ) - ๋‚ด๋ถ€ ์กฐ์ธ (Inner Join) & ์™ธ๋ถ€ ์กฐ์ธ (Outer Join)  (0) 2023.07.22
  1. (1) ํŠธ๋žœ์žญ์…˜์ด๋ž€
  2. (2) ํŠธ๋žœ์žญ์…˜์˜ 4๊ฐ€์ง€ ํŠน์„ฑ (ACID)
  3. (2-1) Atomicity (์›์ž์„ฑ)
  4. (2-2) Consistency (์ผ๊ด€์„ฑ)
  5. (2-3) Isolation (๊ฒฉ๋ฆฌ์„ฑ)
  6. (2-4) Durability (์ง€์†์„ฑ)
  7. (1) ๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ
  8. (1-1) Dirty Read
  9. (1-2) Non-Repeatable Read
  10. (1-3) Phantom Read
  11. (2) DB์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€ [๊ฒฉ๋ฆฌ์„ฑ ์ ‘๊ทผ ๋ ˆ๋ฒจ]
  12. (2-1) Read Uncommitted - ์ปค๋ฐ‹๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ฝ์Œ
  13. (2-2) Read Committed - ์ปค๋ฐ‹๋œ ๊ฒƒ์„ ์ฝ์Œ
  14. (2-3) Repeatable Read โ€“ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฝ์Œ
  15. (2-4) Serializable Read - ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅ (์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ค„์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋จ)
'๐Ÿ‘จโ€๐Ÿ’ป Back End/MySQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • DB Lock ์‹ฌํ™” (์–ด๋ ค์šด ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ์•„....์ž‘์„ฑ์ค‘....)
  • DB Lock ๊ธฐ์ดˆ
  • ํŠธ๋žœ์žญ์…˜ (Transaction)
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด
KR_DEV
KR_DEV
๊ณต๋ถ€์šฉ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. :)
๋ฐ˜์‘ํ˜•
KR_DEV
All about IT
KR_DEV
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ์ „์ฒด (139)
    • ๐Ÿ“š ์—ฐ์žฌ ์‹œ๋ฆฌ์ฆˆ (19)
      • ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๋ฉด ์ข‹์„ ๋‚ด์šฉ (11)
      • ์ž์ฃผ ์“ฐ์ด๋Š” IT ์šฉ์–ด ์ •๋ฆฌ (6)
      • ์žก๋‹คํ•œ IT ์ •๋ณด (2)
    • ๐ŸŽฎ Toy Project (1)
    • ๐Ÿ’ฏ Coding Test (35)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ (14)
      • SQL ํ…Œ์ŠคํŠธ (21)
    • ๐Ÿ’ป Computer Science (14)
      • Hardware (4)
      • Operating System (3)
      • Network (4)
      • Database (3)
      • Data Structures (0)
      • Algorithms (0)
    • ๐ŸŒ Front End (0)
      • HTML5 (0)
      • CSS3 (0)
    • ๐Ÿ‘จโ€๐Ÿ’ป Back End (30)
      • Spring (5)
      • MySQL (12)
      • Redis (3)
      • OOP (0)
      • Design Pattern (0)
      • HTTP (2)
      • Servlet (1)
      • JDBC (7)
      • MSA (0)
    • ๐Ÿ› ๏ธ Devops (12)
      • HAProxy (1)
      • Linux (6)
      • Virtual Machine (4)
      • Container (0)
      • Ansible (1)
    • ๐Ÿง Programming (20)
      • Java (10)
      • Python (10)
    • ๐ŸŒฅ๏ธ Cloud (2)
      • AWS (1)
      • Oracle Cloud (0)
    • ๐Ÿ’พ Storage (5)
      • MiniO (3)
    • ๐Ÿ” Security & Hacking (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

  • ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ํ†ต๊ณผํ–ˆ๋„ค์š” !!!
  • ์•ˆ๋…•ํ•˜์„ธ์š”.

์ธ๊ธฐ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
KR_DEV
ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์„ฑ ์ˆ˜์ค€
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.