JiwonDev

์ •๋ฆฌ์ค‘ - 3

by JiwonDev
  • Transcation
    ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„๋กœ, ์ „๋ถ€ ์ฒ˜๋ฆฌ(commit)๋˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”(rollback) ์›์ž์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.
  • Lock
    ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์—์„œ ๊ฐ™์€ ์ž์›์ด ๋™์‹œ์— ํ•„์š”ํ•˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ„์˜ ๊ฒฝํ•ฉ(Race)๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.
    ์ด ๋•Œ ๊ฐ์ž์˜ ์ž‘์—…์— ์˜ํ–ฅ์ด ๋ผ์น˜์ง€ ์•Š๋„๋ก ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด Thread Lock์„ ๊ฑธ์–ด ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ€๊ธฐ์‹œํ‚จ๋‹ค.

 

MySQL์—์„œ ์‚ฌ์šฉํ•˜๋Š” Lock์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

- MySQL Engine Level Lock

- Storage Engine Level Lock

 

๐Ÿ“Œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ ๋ฝ

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ (InnoDB)์—์„œ ์ œ๊ณตํ•˜๋Š” Lock์€ 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋น„๊ด€์  Lock (Pessimistic locking)์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋น„๊ด€์ ์ธ(Pessimistic) lock
    โžก ์•„๋ฌดํŠผ ํŠธ๋žœ์žญ์…˜์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ์ผ๋‹จ ๋ฝ์„ ๊ฑธ๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋‚™๊ด€์ ์ธ(Optimistic) lock
    โžก ์ผ๋‹จ ๋ฝ ์—†์ด ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์„ ์ง„ํ–‰ํ•˜๊ณ , ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ถฉ๋Œ์ด ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ถฉ๋Œ ๋‚œ ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜๋Š” ๋ฐฉ์‹ (๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•)

๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค๋Š” ๋ฌด๊ฒฐ์„ฑ์„ ์‚ด์ง ํฌ๊ธฐํ•˜๋”๋ผ๋„ lock์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‚™๊ด€์ ์ธ Lock์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 

@ Lock์„ ๊ฑฐ๋Š” ๋ฒ”์œ„

๋˜ํ•œ InnoDB๋Š” Lock์„ ๊ฑฐ๋Š” ๋ฒ”์œ„๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. MyISBM๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ ˆ์ฝ”๋“œ ๋ฝ๋„ ๊ฐ€๋Šฅ.

  • Record Lock
    SELECT col FROM table WHERE col=10 FOR UPDATE; ์ผ ๋•Œ col=10 ์ธ ๋ ˆ์ฝ”๋“œ์—๋งŒ ๋ฝ์„ ๊ฑด๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.
    ๋‹ค๋งŒ ์‹ค์ œ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ์— Lock์„ ๊ฑฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ(=์ธ๋ฑ์Šค)์— Lock์„ ๊ฑด๋‹ค.
    ๋งŒ์•ฝ ๋”ฐ๋กœ ์ƒ์„ฑํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด InnoDB๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด Lock์„ ๊ฑด๋‹ค.

  • Gap Lock (๋ฒ”์œ„, ์ค‘๊ฐ„ ๊ฐญ Lock)
    ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์™€ ์ธ์ ‘ํ•œ ์•ž/๋’ค ๊ณต๊ฐ„์— Lock์„ ๊ฑด๋‹ค. ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š๊ณ  ๋’ค์— ์„ค๋ช…ํ•  Next Key Lock์™€ ์‚ฌ์šฉ.
    Gap Lock์€ ์™ธ๋ž˜ํ‚ค๋‚˜ ์ค‘๋ณตํ‚ค๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ณดํ†ต REPEATABLE_READ ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.
    ๋‹ค๋งŒ ๊ธฐ๋ณธ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค์— ์˜ํ•œ ๋ณ€๊ฒฝ ์ž‘์—…์€ Gap Lock ์—†์ด Record Lock์œผ๋กœ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์—๋งŒ ๋ฝ์„ ๊ฑด๋‹ค. 
  • Next Key Lock
    Record lock + Gap lock ์˜ ํ˜•ํƒœ์ด๋‹ค. ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋„ ์ž ๊ตฌ๊ณ , ์•ž ๋’ค ๊ฐญ๋„ ์ž ๊ทผ๋‹ค.
    SELECT c1 FROM t WHERE c1 BETWEEN 10 AND 20 FOR UPDATE; ์ผ ๋•Œ c1=15 ์™€ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ๋ง‰๋Š”๋‹ค. ๋ฐ˜๋“œ์‹œ ์ธ๋ฑ์Šค ๋ฒ”์œ„์—๋งŒ ๋ฝ์„ ๊ฑฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, [์ธ๋ฑ์Šค ๋ฒ”์œ„ ์‚ฌ์ด์— ์žˆ๋Š” ๊ฐญ]์„ ๊ฐ™์ด ๋ฝ์„ ๊ฑด๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด c1=10, c1=8 ์ด๋ ‡๊ฒŒ 2๊ฐ€์ง€ ๋ ˆ์ฝ”๋“œ์— Lock ์ด ๊ฑธ๋ ธ๋‹ค๋ฉด, ์ค‘๊ฐ„์— ์žˆ๋Š” c1=9 ์ž‘์—…๋„ Lock์œผ๋กœ ๋ง‰ํ˜€์žˆ๋‹ค.

    ๊ตณ์ด ๋ณ€ํƒœ๊ฐ™์€ Next key lock์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” REPEATABLE_READ์˜ ์‚ฌ์šฉ์„ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ณต์ œ๋ฅผ ์œ„ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ๋•Œ๋ฌธ์ด๋‹ค.
    MySQL5.1 ์ดํ›„์—๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด REPEATABLE_READ ์ด์ƒ์˜ ๋ ˆ๋ฒจ์„ ๊ฐ•์ œํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Next Key Lock์œผ๋กœ 

  • Auto Increment lock
    MySQL์—์„œ ์ž๋™ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž ๊ฐ’์„ ์–ป๊ธฐ์œ„ํ•ด Auto Increment๋ฅผ ์ •์˜ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๋–„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— Insert๋ฅผ ๋ชปํ•˜๊ฒŒ ๊ฑธ์–ด์ฃผ๋Š” Lock์ด๋‹ค.

 

 

@ InnoDB๋Š” ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ๋ฝ์ž…๋‹ˆ๋‹ค.

InnoDB์˜ ๋ ˆ์ฝ”๋“œ๋ฝ์€ '์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ' ๋ฝ์ด๋‹ค. ์ด๋Š” ๋งค์šฐ ํฐ ์ฐจ์ด์ธ๋ฐ, ์•„๋ž˜์˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

 

์šฐ๋ฆฌ์˜ ์‹ ์ž…๊ฐœ๋ฐœ์ž A๋Š” first_name ์นผ๋Ÿผ์—๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜์˜€๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

์ด ๋•Œ [ first_name = 'KIM' ]์ธ ๋ ˆ์ฝ”๋“œ๋Š” 300๊ฑด

        [ first_name = 'KIM' , last_name = 'WON' ]์ธ ๋ ˆ์ฝ”๋“œ๋Š” ๋‹จ 1๊ฑด์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

SELECT COUNT(*) FROM employees WHERE first_name='KIM'; -- 300๊ฑด ์กฐํšŒ๋œ๋‹ค๊ณ  ๊ฐ€์ •
SELECT COUNT(*) FROM employees WHERE first_name='KIM' AND last_name='WON'; -- 1๊ฑด ์กฐํšŒ๋œ๋‹ค๊ณ  ๊ฐ€์ •
UPDATE employees SET hire_date=NOW() WHERE first_name='KIM' AND last_name='WON'; -- ์–ด๋””์— ๋ฝ์ด ๊ฑธ๋ฆด๊นŒ?

first_name ์นผ๋Ÿผ์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. 3๋ฒˆ์งธ Update ์ฟผ๋ฆฌ์—์„œ Lock์ด ๊ฑธ๋ฆฌ๋Š” ๋ ˆ์ฝ”๋“œ๋Š” ๋ช‡ ๊ฐœ์ผ๊นŒ?

 

์ •๋‹ต์€ 300๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ์ด๋‹ค. ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์— ๋ฝ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ.

[ first_name = 'KIM' , last_name = 'WON' ]์ธ ์‚ฌ๋žŒ์€ ๋‹จ 1๊ฑด์ด์ง€๋งŒ, ์ธ๋ฑ์Šค์— Next key Lock์„ ๊ฑฐ๋Š” ๊ธฐ๋ณธ ์ •์ฑ…์ƒ first_name์— ๋ฝ์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ 300๊ฑด ์ „์ฒด์— Lock์„ ๊ฑธ๊ฒŒ๋˜๊ณ , ์‹ค์ œ ์ˆ˜์ •์€ ๋‹จ 1๊ฑด๋งŒ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ์ธ๋ฑ์Šค๋ฅผ ์•„์˜ˆ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ์ด ๊ฒฝ์šฐ InnoDB๋Š” ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„์˜ Next Key Lock์„ ๊ฑฐ๋‹ˆ๊นŒ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ฐฉ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์‹ค์ œ ๋™์ž‘์€ ํ…Œ์ด๋ธ” ์ „์ฒด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๊ฒŒ ๋œ๋‹ค.

 

๋ ˆ์ฝ”๋“œ ๋‹จ์œ„์˜ Lock์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ž ๊ธˆ์˜ ๋Œ€์ƒ์ด ํ…Œ์ด๋ธ”์ด๋ผ์„œ ๋ฌธ์ œ์˜ ์›์ธ์ด ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌ๋˜๊ณ , ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€ ์ž ๊ธˆ์€ ํ•ด๋‹น ์ฟผ๋ฆฌ, ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ž˜ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ทธ๋ž˜์„œ MySQL5.1๋ถ€ํ„ฐ๋Š” information_schema์•ˆ์— ์žˆ๋Š” INNODB_TRX์—์„œ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ์™€ ์ž ๊ธˆ ๋Œ€๊ธฐ์— ๋Œ€ํ•œ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์—ˆ๋‹ค. ์ฐธ๊ณ ๋กœ MySQL8.0 ๋ถ€ํ„ฐ๋Š” ๊ธฐ์กด์˜ ์Šคํ‚ค๋งˆ ํ…Œ์ด๋ธ”์„ ์ œ๊ฑฐ(Deprecated)ํ•˜๊ณ  performance_scheman์˜ data_locks, data_lock_waits ๋ผ๋Š” ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”๋กœ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

 

@ ์„œ๋ธŒ์ฟผ๋ฆฌ SELECT LOCK, ๋ฐ๋“œ๋ฝ

InnoDB ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฒฝ์šฐ

 

[MySQL]MySQL ๋ฒผ๋ฝ์น˜๊ธฐ(6) - ํŠธ๋žœ์žญ์…˜๊ณผ์ž ๊ธˆ(2)

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์‚ฌ๋‚ด์—์„œ MySQL ๊ด€๋ จ ๋‚ด์šฉ ๋ฐœํ‘œ๋ฅผ ์œ„ํ•ด Real MySQL(http://wikibook.co.kr/real-mysql/) ์„œ์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•™์Šตํ•˜๊ณ  ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋Š” ํฌ์ŠคํŒ…์ด๋‹ค. ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฃผ๋กœ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

idea-sketch.tistory.com

1. ๋‹จ์ˆœ ์กฐํšŒ๋Š” ๋‹น์—ฐํžˆ ๋ฝ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ณ€๊ฒฝ์ค‘์ด๋ผ๋ฉด ์‹ค์ œ ๊ฐ’์ด ์•„๋‹Œ Undo ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

SELECT ... FROM

 

2. ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ์š”? ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ Select๋Š” Shared Lock์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์•„๋ž˜์˜ 3์ฟผ๋ฆฌ๊ฐ€ ์ด ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ๋‹ค๋ฉด ์˜์›ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๋ฐ๋“œ๋ฝ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

# session 1 - ์œ ์ € ํ…Œ์ด๋ธ”๊ณผ accounts ํ…Œ์ด๋ธ”์—์„œ ๊ณ„์ •์„ ์‚ญ์ œํ•˜๋Š” ์„ธ์…˜
DELETE 
FROM user_table
WHERE account_id = 99; # X-LOCK 

# session 2 - VIP ๋ฅผ ์ฐพ์•„์„œ ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์„ธ์…˜
UPDATE user_table 
SET vip_flag = 1 
WHERE account_id in (SELECT account_id FROM accounts WHERE amount >= 100000000) # S-LOCK 

# session 1 - ์œ ์ €ํ…Œ์ด๋ธ” ์ฟผ๋ฆฌ๋Š” ๋‚ ๋ ธ์œผ๋‹ˆ, ์ด์ œ accounts ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•ด๋ณผ๊นŒ..
DELETE 
FROM accounts 
WHERE account_id = 99; # id=99 ์ธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •.

ํ•ด๋‹น ์ฟผ๋ฆฌ๋Š” ๋ฐ๋“œ๋ฝ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์•„์˜ˆ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

session 1: account_id ๋ฅผ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ account_id=99 ์— Lock์„ ๊ฒ๋‹ˆ๋‹ค.

session 2: accounts ํ…Œ์ด๋ธ”์— ์ž”์•ก์ด 1์–ต์› ์ด์ƒ์ธ ์œ ์ €๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฝ๋‹ˆ๋‹ค.

- ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ accounts์˜ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ์™€ ๊ฐญ์— Shared Lock์„ ๊ฒ๋‹ˆ๋‹ค. ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” Undo ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์š”.

- ์—ฌ๊ธฐ์„œ session2๋Š” ์•ž์—์„œ session1์˜ account_id=99 ์ธ๋ฑ์Šค ๋•Œ๋ฌธ์— user_table ๋ฝ์ด ๊ฑธ๋ ค์„œ ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

session1 : ์ดํ›„ account_id๊ฐ€ 99์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ accounts์—์„œ ์ง€์šฐ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ธ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Session2๊ฐ€ ์„œ๋ธŒ์ฟผ๋ฆฌ์— accounts Lock์„ ๊ฑธ์–ด๋ฒ„๋ ค์„œ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ MySQL ์—”์ง„ ๋ ˆ๋ฒจ ๋ฝ

  • ๊ธ€๋กœ๋ฒŒ ๋ฝ
    ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋ฝ์„ ๊ฒ๋‹ˆ๋‹ค. DB ๋คํ”„๋ฅผ ๋”ฐ๋Š” ๋“ฑ์˜ ์ •๋ง ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ๋ฝ
    ๊ฐ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ Lock์„ ๊ฒ๋‹ˆ๋‹ค. InnoDB์—์„œ ๋ ˆ์ฝ”๋“œ ๋ฝ์ด ์ œ๊ณต๋˜๋ฏ€๋กœ DML์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , DDL ์ฒ˜๋Ÿผ ์Šคํ‚ค๋งˆ ์ž์ฒด๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์ข…์ข… ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Name ๋ฝ
    ํ…Œ์ด๋ธ” ์ด๋ฆ„, ๋ทฐ ์ด๋ฆ„๋“ฑ ์Šคํ‚ค๋งˆ ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋ฝ์„ ๊ฒ๋‹ˆ๋‹ค.
  • ์œ ์ € ๋ฝ
    ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์— ๋ฝ์„ ๊ฒ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ์„ค์ • ๊ฐ’์„ ๋™๊ธฐํ™”ํ•˜๋Š” ์šฉ๋„๋กœ ์ข…์ข… ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

'๐ŸŒฑBackend > DB(MySQL,PostgreSQL)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ •๋ฆฌ์ค‘-5  (0) 2021.10.27
์ •๋ฆฌ์ค‘ - 4  (0) 2021.10.20
์ •๋ฆฌ์ค‘ -2  (0) 2021.10.20
์ •๋ฆฌ์ค‘ #1 ์—”์ง„ ์•„ํ‚คํ…์ฒ˜  (0) 2021.10.13
1. MySQL์€ ๋ฌด์—‡์ธ๊ฐ€  (0) 2021.10.13

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ