InnoDB Storage Engine Lock

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ๋‹ค๋ฅธ MySQL ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

  • ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ(Row-level Lock)์„ ์ œ๊ณตํ•˜์—ฌ ๋†’์€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  • ์ž ๊ธˆ ์ •๋ณด๋ฅผ ํšจ์œจ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์ž ๊ธˆ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ๋„ ๋ ˆ์ฝ”๋“œ ๋ฝ์ด ํŽ˜์ด์ง€ ๋ฝ์ด๋‚˜ ํ…Œ์ด๋ธ” ๋ฝ์œผ๋กœ ํ™•์žฅ๋˜๋Š” ์ž ๊ธˆ ์—์Šค์ปฌ๋ ˆ์ด์…˜(Lock Escalation)์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

์ž ๊ธˆ์˜ ๊ธฐ๋ณธ ๋ชจ๋“œ

InnoDB์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€ ์ž ๊ธˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์œ (Shared) ๋ชจ๋“œ์™€ ๋ฐฐํƒ€์ (Exclusive) ๋ชจ๋“œ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๊ณต์œ  ์ž ๊ธˆ (Shared Lock, S-Lock): ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ณต์œ  ์ž ๊ธˆ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ(๋ฐฐํƒ€์  ์ž ๊ธˆ ํš๋“)ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ

    • SELECT ... LOCK IN SHARE MODE ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ํš๋“

  • ๋ฐฐํƒ€์  ์ž ๊ธˆ (Exclusive Lock, X-Lock): ์˜ค์ง ์ž ๊ธˆ์„ ์†Œ์œ ํ•œ ํŠธ๋žœ์žญ์…˜๋งŒ์ด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

    • ๋ฐฐํƒ€์  ์ž ๊ธˆ์ด ์„ค์ •๋œ ๋ ˆ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ๊ณต์œ  ์ž ๊ธˆ์ด๋‚˜ ๋ฐฐํƒ€์  ์ž ๊ธˆ์„ ์ถ”๊ฐ€๋กœ ํš๋“ํ•  ์ˆ˜ ์—†์Œ

    • SELECT ... FOR UPDATE, UPDATE, DELETE ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ํš๋“

๋ ˆ์ฝ”๋“œ ๋ฝ(Record Lock)

๋ ˆ์ฝ”๋“œ ๋ฝ์€ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ์— ์ž ๊ธˆ์„ ์„ค์ •ํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ ์ž ๊ธˆ์ด๋‹ค.

  • ๋™์ž‘ ๋ฐฉ์‹: ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹Œ, ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ๋ฑ์Šค ์—”ํŠธ๋ฆฌ๋ฅผ ์ž ๊ธˆ

    • ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด, InnoDB๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค(ROW_ID)๋ฅผ ์‚ฌ์šฉํ•ด ์ž ๊ธˆ ์„ค์ •

  • ์ž ๊ธˆ ๋ฒ”์œ„: ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์ž ๊ธˆ์˜ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •

    • ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ž ๊ทธ๋Š” ๊ฒฝ์šฐ, ์ •ํ™•ํžˆ ํ•ด๋‹น ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜์—๋งŒ ์ž ๊ธˆ์ด ์„ค์ •

๋ ˆ์ฝ”๋“œ ์ž์ฒด ์ž ๊ธˆ & ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ ์ฐจ์ด

๋ ˆ์ฝ”๋“œ ๋ฝ์€ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค๋ฅผ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

-- ํ…Œ์ด๋ธ” ์ •๋ณด
-- TABLE NAME: employees
-- KEY ix_firstname (first_name)
SELECT COUNT(*)
FROM employees; -- 300000

SELECT COUNT(*)
FROM employees
WHERE first_name = 'Kwon'; -- 253

SELECT COUNT(*)
FROM employees
WHERE first_name = 'Kwon'
  AND last_name = 'Ogu'; -- 1

UPDATE employees
SET hire_date = NOW()
WHERE first_name = 'Kwon'
  AND last_name = 'Ogu';
  • ์œ„์˜ ์‹คํ–‰ ๋ฌธ์—์„œ UPDATE ๋ฌธ์žฅ์€ ๋‹จ ํ•œ ๊ฑด์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ๋ณ€๊ฒฝ

  • ํ•˜์ง€๋งŒ ์ด ๋ฌธ์žฅ์˜ ์กฐ๊ฑด์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์€ first_name ์ปฌ๋Ÿผ ํ•˜๋‚˜๋งŒ ์กด์žฌ

  • ๋•Œ๋ฌธ์— first_name ์ปฌ๋Ÿผ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ž ๊ทธ๊ฒŒ ๋˜๊ณ , ์ด์— ๋”ฐ๋ผ first_name ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด Kwon์ธ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฝ ์ƒ์„ฑ

  • ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์Šค์บ”ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—๋Š” ๋ ˆ์ฝ”๋“œ ์กฐํšŒ ์‹œ ํ…Œ์ด๋ธ”์„ ํ’€ ์Šค์บ”ํ•˜๋ฉด์„œ 30๋งŒ ๊ฑด์˜ ๋ ˆ์ฝ”๋“œ ์ „๋ถ€ ๋ฝ์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋จ

๊ฐญ ๋ฝ(Gap Lock)

๋ ˆ์ฝ”๋“œ๊ฐ€ ์ง€์ •๋œ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” ๊ณต๊ฐ„์„ ๋Œ€์ƒ์œผ๋กœ ๊ฑฐ๋Š” ์ž ๊ธˆ์œผ๋กœ, ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๊ตฌ๊ฐ„(Gap)์— ๋Œ€ํ•ด ์„ค์ •๋œ๋‹ค.

  • ๋ชฉ์ : ์ด ๊ฐ„๊ฒฉ ๋‚ด์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ INSERT ๋ฐฉ์ง€

  • ๋™์ž‘: ๊ฐญ ๋ฝ์€ ๊ทธ ์ž์ฒด๋กœ ํŠน์ • ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๋Š” ํšจ๊ณผ๋Š” ์—†์œผ๋ฉฐ, ์˜ค์ง ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์˜ ์‚ฝ์ž…๋งŒ ๋ฐฉ์ง€

    • ๊ฐญ ๋ฝ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ๊ฐญ์— ๋Œ€ํ•ด ๊ฐญ ๋ฝ์„ ๋™์‹œ์— ๋ณด์œ  ๊ฐ€๋Šฅ

-- 51 ~ 55 ์‚ฌ์ด์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฒ ํƒ€์  ์ž ๊ธˆ ํš๋“ํ•˜๋Š” ์ฟผ๋ฆฌ
SELECT *
FROM member
WHERE 51 <= age
  AND age <= 55
    FOR
UPDATE;

age 52 / 53์„ ๊ฐ€์ง„ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋ฉด, ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, 51๊ณผ 55 ์‚ฌ์ด์˜ ๊ณต๊ฐ„์— ๋Œ€ํ•ด ๊ฐญ ๋ฝ์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

age
PK
์ž ๊ธˆ ์—ฌ๋ถ€

...

...

...

50

59

X

๊ฐญ ๋ฝ(51 ~ 52 ์‚ฌ์ด์˜ ๊ณต๊ฐ„)

52

61

๋ ˆ์ฝ”๋“œ ๋ฝ

53

62

๋ ˆ์ฝ”๋“œ ๋ฝ

๊ฐญ ๋ฝ(53 ~ 55 ์‚ฌ์ด์˜ ๊ณต๊ฐ„)

56

65

X

๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ(Next-Key Lock)

๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์€ ๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์„ ํ•ฉ์นœ ํ˜•ํƒœ๋กœ, InnoDB์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ธ REPEATABLE READ์—์„œ ํŒฌํ…€ ๋ฆฌ๋“œ(Phantom Read)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

  • ํŠน์ • ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ ๋ฝ + ํ•ด๋‹น ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์ด์ „์˜ ๊ฐ„๊ฒฉ์— ๋Œ€ํ•œ ๊ฐญ ๋ฝ

  • ํŠน์ • ๋ ˆ์ฝ”๋“œ์™€ ๊ทธ ์•ž๋’ค ๊ฐ„๊ฒฉ์„ ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„์— ๋Œ€ํ•ด (prev, current] ๋ฐฉ์‹์œผ๋กœ ์ž ๊ธˆ ์„ค์ •

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

์˜ˆ์‹œ

age
PK

50

101

52

102

56

103

age ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง„ member ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด InnoDB๋Š” ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค.

SELECT *
FROM member
WHERE age = 52 FOR
UPDATE;

์œ„ ์ฟผ๋ฆฌ๋Š” ๋‹จ์ผ ๊ฐ’(age = 52)๋งŒ ์กฐํšŒํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด ์„ค์ •๋œ๋‹ค.

  • (50, 52] ๋ฒ”์œ„: ๋ ˆ์ฝ”๋“œ 52์™€ ๊ทธ ์•ž ๊ณต๊ฐ„

  • (52, 56] ๋ฒ”์œ„: ๋ ˆ์ฝ”๋“œ 52 ๋‹ค์Œ ๊ฐ’๊ณผ์˜ ๊ฐญ๋„ ํฌํ•จ

์ด์ฒ˜๋Ÿผ ์œ ๋‹ˆํฌ ํ•˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค์˜ ๋‹จ์ผ ๊ฐ’์„ ์กฐํšŒํ•˜๋”๋ผ๋„ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์€ ์ธ๋ฑ์Šค ์ˆœ์„œ์ƒ ์•ž๋’ค ๊ฐญ์„ ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ์ž ๊ธˆํ•˜๊ฒŒ ๋œ๋‹ค.

๊ตฌ๋ถ„
๋ฒ”์œ„
์„ค๋ช…

๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ

(50, 52]

๋ ˆ์ฝ”๋“œ 52์™€ ์•ž์˜ ๊ฐญ ํฌํ•จ

๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ

(52, 56]

๋ ˆ์ฝ”๋“œ 52 ์ดํ›„ ์ธ๋ฑ์Šค์ƒ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ์™€์˜ ๊ฐญ

๋ ˆ์ฝ”๋“œ ๋ฝ

52

๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ๋œ ๋ ˆ์ฝ”๋“œ ์ž์ฒด

๋‹จ์ผ ์กฐํšŒ ์‹œ์—๋„ ๋ฒ”์œ„์— ๋Œ€ํ•ด ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด ๊ฑธ๋ฆฌ๋Š” ์ด์œ 

๋ฝ์„ ์ด์šฉํ•œ ์ฝ๊ธฐ, UPDATE, DELETE์™€ ๊ฐ™์€ ๋ช…๋ น๋ฌธ์€ SQL ๋ช…๋ น๋ฌธ ์ฒ˜๋ฆฌ ์‹œ InnoDB๋Š” ์ •ํ™•ํ•œ WHERE ์กฐ๊ฑด์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ณ , ์Šค์บ”๋œ ์ธ๋ฑ์Šค ๋ฒ”์œ„์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ์„ค์ •ํ•œ๋‹ค.

  • ์œ ๋‹ˆํฌํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ: InnoDB๋Š” ๋ฐœ๊ฒฌ๋œ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋งŒ ์ž ๊ธˆ

  • ์œ ๋‹ˆํฌํ•˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค or ๋ฒ”์œ„ ์กฐ๊ฑด: InnoDB๋Š” ์Šค์บ”๋œ ์ธ๋ฑ์Šค ๋ฒ”์œ„์— ๋Œ€ํ•ด ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ์„ค์ •

์ž๋™ ์ฆ๊ฐ€ ๋ฝ(Auto-Increment Lock)

AUTO_INCREMENT ์†์„ฑ์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์œ ๋‹ˆํฌํ•œ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ํ•œ ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ์ž ๊ธˆ์ด๋‹ค.

  • ๋‚ด๋ถ€์ ์œผ๋กœ ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ์ž ๊ธˆ์„ ๊ฑธ์–ด ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๋ณด์žฅ

  • ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•  ์ˆ˜ ์—†์Œ

  • MySQL 8.0์—์„œ๋Š” ์ž ๊ธˆ์„ ๊ฑธ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ innodb_autoinc_lock_mode ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(๊ธฐ๋ณธ๊ฐ’: 1)

๊ฐ’
AUTO_INCREMENT ๊ฐ’ ์—ฐ์†์„ฑ
๋™์‹œ INSERT ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ
๋ฝ ๋™์ž‘ ๋ฐฉ์‹ ์„ค๋ช…

0(TRADITIONAL)

ํ•ญ์ƒ ์—ฐ์†์ 

๋งค์šฐ ๋‚ฎ์Œ (์ง๋ ฌ ์ฒ˜๋ฆฌ)

๋ชจ๋“  INSERT์—์„œ ํ…Œ์ด๋ธ” ๋‹จ์œ„ ๋ฝ์„ ๊ฑธ๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ AUTO_INCREMENT ๊ฐ’์„ ํ• ๋‹น

1(CONSECUTIVE)

๋Œ€๋ถ€๋ถ„ ์—ฐ์†์ 

๋ณดํ†ต

์‚ฝ์ž… ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ INSERT๋Š” ๋ฝ์„ ์ตœ์†Œํ•œ์œผ๋กœ ๊ฑธ์Œ / INSERT ... SELECT ๊ฐ™์€ ์‚ฝ์ž… ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ตฌ๋ฌธ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ…Œ์ด๋ธ” ๋‹จ์œ„ ๋ฝ ์œ ์ง€

2(INTERLEAVED)

์—ฐ์†์„ฑ ๋ณด์žฅ ์•ˆ ๋จ

๋งค์šฐ ๋†’์Œ

๋ฝ์„ ์žก์ง€ ์•Š์•„ ๋น ๋ฅด๊ฒŒ ์‚ฝ์ž…ํ•˜๋‚˜ ID๋Š” ๋น„์—ฐ์†์ ์ผ ์ˆ˜ ์žˆ์Œ

๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ž ๊ธˆ ํ™•์ธ ๋ฐ ํ•ด์ œ

ํ…Œ์ด๋ธ” ์ž ๊ธˆ์€ ์ž ๊ธˆ์˜ ๋Œ€์ƒ์ด ํ…Œ์ด๋ธ” ์ž์ฒด์ด๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋ฌธ์ œ ํŒŒ์•…์ด ๋˜์ง€๋งŒ, ๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ž ๊ธˆ์€ ๊ฑธ๋ ค์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

์ปค๋„ฅ์…˜1
์ปค๋„ฅ์…˜2
์ปค๋„ฅ์…˜3

BEGIN;

UPDATE employees SET birth_date=NOW() WHERE emp_no=10001;

UPDATE employees SET hire_date=NOW() WHERE emp_no=10001;

UPDATE employees SET hire_date=NOW(), birth_date=NOW() WHERE emp_no=10001;

์œ„ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ปค๋„ฅ์…˜ 1์ด ์•„์ง COMMIT์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ ์ž ๊ธˆ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ปค๋„ฅ์…˜ 2 / ์ปค๋„ฅ์…˜ 3์€ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ ์ž ๊ธˆ์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT
    -- ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ์ •๋ณด
    r.trx_id              waiting_trx_id,
    r.trx_mysql_thread_id waiting_thread,
    r.trx_query           waiting_query,
    -- ์ž ๊ธˆ์„ ๋ณด์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ์ •๋ณด
    b.trx_id              blocking_trx_id,
    b.trx_mysql_thread_id blocking_thread,
    b.trx_query           blocking_query
FROM performance_schema.data_lock_waits w
         INNER JOIN information_schema.innodb_trx b
                    ON b.trx_id = w.blocking_engine_transaction_id
         INNER JOIN information_schema.innodb_trx r
                    ON r.trx_id = w.requesting_engine_transaction_id

MySQL 8.0 ๊ธฐ์ค€ performance_schema ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜์—ฌ ์ž ๊ธˆ๊ณผ ๋Œ€๊ธฐ ์ˆœ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

waiting_trx_id
waiting_thread
waiting_query
blocking_trx_id
blocking_thread
blocking_query

0x7f9b1c0003

3

UPDATE employees...

0x7f9b1c0002

2

UPDATE employees...

0x7f9b1c0003

3

UPDATE employees...

0x7f9b1c0001

1

NULL

0x7f9b1c0002

2

UPDATE employees...

0x7f9b1c0001

1

NULL

์œ„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์–ด๋–ค ์Šค๋ ˆ๋“œ์˜ ์ž ๊ธˆ์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • 2๋ฒˆ ์Šค๋ ˆ๋“œ: 1๋ฒˆ ์Šค๋ ˆ๋“œ์˜ ๋ฝ ๋Œ€๊ธฐ

  • 3๋ฒˆ ์Šค๋ ˆ๋“œ: 2๋ฒˆ ์Šค๋ ˆ๋“œ + 1๋ฒˆ ์Šค๋ ˆ๋“œ์˜ ๋ฝ ๋Œ€๊ธฐ

์ฐธ๊ณ ์ž๋ฃŒ

Last updated

Was this helpful?