๐Ÿ“š Databases/RealMySQL 8.0

5.4 MySQL์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

iseunghan 2023. 3. 16. 23:36
๋ฐ˜์‘ํ˜•

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(isolation level)์ด๋ž€ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋  ๋•Œ ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํฌ๊ฒŒ 4๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

  1. READ UNCOMMITED (=DIRTY READ)
    • ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. READ COMMITED
    • Oracle ๊ฐ™์€ DBMS์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
  3. REPEATABLE READ
    • MySQL์—์„œ ์‚ฌ์šฉ
  4. SERIALIZABLE
    • ๋™์‹œ์„ฑ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐˆ ์ˆ˜๋ก ํŠธ๋žœ์žญ์…˜ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ •๋„๊ฐ€ ๋†’์•„์ง€๋ฉฐ, ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋‚ฎ์•„์ง„๋‹ค.

ํ•˜์ง€๋งŒ, SERIALIZABLE์ด ์•„๋‹Œ ๋‚˜๋จธ์ง€ 3๊ฐœ๋Š” ํฌ๊ฒŒ ์„ฑ๋Šฅ์˜ ๊ฐœ์„ ์ด๋‚˜ ์ €ํ•˜๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

5.4.1 READ UNCOMMITED

๊ฐ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด COMMIT, ROLLBACK ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณด์ธ๋‹ค.

  • A ํŠธ๋žœ์žญ์…˜์—์„œ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  commit์„ ํ•˜๊ธฐ ์ „์ธ๋ฐ๋„ B ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ๋ฌธ์ œ๋Š” A ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ์ด ๋˜์—ˆ์„ ๊ฒฝ์šฐ์ด๋‹ค. B ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์ด๋ผ ํŒ๋‹จํ•˜๊ณ  ์ถ”ํ›„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค ๋ณด์˜€๋‹คํ•˜๋Š” ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ๋”ํ‹ฐ ๋ฆฌ๋“œ(Dirty read)๋ผ๊ณ  ํ•œ๋‹ค.

์ ˆ๋Œ€ ์‚ฌ์šฉ๋˜์–ด์„  ์•ˆ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

5.4.2 READ COMMITED (NON-REPEATABLE READ)

์˜จ๋ผ์ธ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์„ ํƒ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. ๋”ํ‹ฐ ๋ฆฌ๋“œ ํ˜„์ƒ์€ ์—ฌ๊ธฐ์„œ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  COMMIT์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Untitled

  • COMMIT ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, ์–ธ๋‘ ๋กœ๊ทธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • COMMIT์ด ์™„๋ฃŒ๋œ ์ดํ›„์—๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ..
    • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋™์ผํ•œ SELECT๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์•ผํ•œ๋‹ค๋Š” REPEATABLE READ ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚œ๋‹ค.

5.4.3 REPEATABLE READ

MySQL์˜ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง„ MySQL์—์„œ๋Š” ์ตœ์†Œ REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค.

  • READ COMMITED ๊ฒฉ๋ฆฌ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ์˜ ๋ถ€์ •ํ•ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • MVCC(Multi Version Concurrency Control) ์„ ์ด์šฉํ•ด์„œ ์–ธ๋‘ ๋กœ๊ทธ์— ๋ฐฑ์—…ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (MVCC ์„ค๋ช…์€ 4.2.3 ์ ˆ ํ™•์ธ)
  • READ COMMITED์™€ ์ฐจ์ด์ ์€ ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „ ๊ฐ€์šด๋ฐ ๋ช‡๋ฒˆ์งธ ์ด์ „ ๋ฒ„์ „๊นŒ์ง€ ์ฐพ์•„ ๋“ค์–ด๊ฐ€๋Š”์ง€์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜๊ณผ MVCC์— ๋Œ€ํ•ด์„œ..

๋ชจ๋“  InnoDB์˜ ํŠธ๋žœ์žญ์…˜์€ ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ(์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’)๋ฅผ ๊ฐ€์ง„๋‹ค. ์–ธ๋‘ ์˜์—ญ์—๋Š” ๋ฐฑ์—…๋œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์—๋Š” ๋ณ€๊ฒฝ์„ ๋ฐœ์ƒ์‹œํ‚จ ํŠธ๋žœ์žญ์…˜์˜ ๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋‹ค. (์•„๋ž˜ ์ฐธ์กฐ)

+--------+--------+---------+
| TRX-ID | field1 | field 2 |
+--------+--------+---------+
|   6    | 10000  |  test1  |
+--------+--------+---------+
|   12   | 50000  |  test9  |
+--------+--------+---------+

์–ธ๋‘ ์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋Š” InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ ์‹œ์ ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œ๋ฅผ ํ•œ๋‹ค.

REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” MVCC๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์•ž์„  ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

REPEATABLE READ ์ž‘๋™ ๋ฐฉ์‹

์•„๋ž˜ ๊ทธ๋ฆผ์€ REPEATABLE READ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณด์—ฌ์ค€๋‹ค.

Untitled

  1. 10๋ฒˆ(ํŠธ๋žœ์žญ์…˜)์ด SELECT๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค.
  2. ์ดํ›„ 12๋ฒˆ(ํŠธ๋žœ์žญ์…˜)์ด Lara → Toto๋กœ ๋ณ€๊ฒฝ์„ ํ–ˆ๋‹ค.
    1. ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „ ๋ฐ์ดํ„ฐ๋Š” ์–ธ๋‘๋กœ๊ทธ์— ๋ฐฑ์—…๋œ๋‹ค.
  3. 12๋ฒˆ(ํŠธ๋žœ์žญ์…˜)์ด ์ปค๋ฐ‹์„ ํ–ˆ๋‹ค.
  4. 10๋ฒˆ(ํŠธ๋žœ์žญ์…˜)์ด ๋‹ค์‹œ Lara๋ฅผ ์กฐํšŒํ–ˆ๋‹ค.
    1. ์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ, ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋˜๋ฉด? REPEATABLE READ์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚˜๊ฒŒ ๋œ๋‹ค.
    2. ์‚ฌ์‹ค ์กฐํšŒํ•  ์ˆ˜๋„ ์—†๋‹ค. REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์ž์‹ ์˜ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์˜ ๋ฐ์ดํ„ฐ ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. (์ค‘์š”!)
  5. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๋‘๋กœ๊ทธ์— ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

PHANTOM READ (PHANTOM ROW)

์•„๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ดํŽด๋ณด์ž.

Untitled

  1. 10๋ฒˆ ํŠธ๋žœ์žญ์…˜์ด emp_no๊ฐ€ 50000 ์ด์ƒ์ธ ๊ฐ’์„ ์กฐํšŒํ•˜๊ณ  ์žˆ๋‹ค. (1๊ฑด ์กฐํšŒ)
  2. 12๋ฒˆ ํŠธ๋žœ์žญ์…˜์ด 50001๋ฒˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค๋ฐ‹์„ ํ–ˆ๋‹ค.
  3. 10๋ฒˆ ํŠธ๋žœ์žญ์…˜์ด ๋˜‘๊ฐ™์ด SELECT๋ฅผ ํ–ˆ๋‹ค.
    1. ์ด๋•Œ ์›๋ž˜ ๊ฐ™์•˜์œผ๋ฉด ์–ธ๋‘๋กœ๊ทธ์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์ด์ „์ฒ˜๋Ÿผ 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•ด์™€์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ 12๋ฒˆ ํŠธ๋žœ์žญ์…˜์ด ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ด 2๊ฐœ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜์ด ๋œ๋‹ค.

์™œ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ• ๊นŒ?

์–ธ๋‘ ๋ ˆ์ฝ”๋“œ์—๋Š” ์ž ๊ธˆ์„ ๊ฑธ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— SELECT … FOR UPDATE, SELECT … LOCK IN SHARE MODE๋กœ ์กฐํšŒ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋Š” ์–ธ๋‘ ์˜์—ญ์˜ ๋ณ€๊ฒฝ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ž ๊ธˆํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’(์ž ๊ธˆ ์—†์ด)์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

SELECT FOR UPDATE vs LOCK IN SHARE MODE

5.4.4 SERIALIZABLE

  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ  ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.
  • 4๊ฐ€์ง€ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์—์„œ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ์ œ์ผ ๋–จ์–ด์ง„๋‹ค.
  • ์ˆœ์ˆ˜ํ•œ SELECT ์กฐํšŒ๋„ ์ž ๊ธˆ์„ ๊ฑธ๊ฒŒ ๋œ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

*๋ฌผ๋ก  ์œ„์—์„œ ์„ค๋ช…ํ•œ SELECT … FOR UPDATE, SELECT … LOCK IN SHARE MODE ์ฟผ๋ฆฌ๊ฐ™์ด ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์€ ์ œ์™ธํ•˜๊ณ  ๋ง์ด๋‹ค.

๋ฐ˜์‘ํ˜•