Home /Database/๐Ÿ’ฌ MySQl/ ํŠธ๋žœ์žญ์…˜๊ณผ ์ž ๊ธˆ
Post
Cancel

/Database/๐Ÿ’ฌ MySQl/ ํŠธ๋žœ์žญ์…˜๊ณผ ์ž ๊ธˆ



โœ”๏ธ ์ž ๊ธˆ(Lock)๊ณผ ํŠธ๋žœ์žญ์…˜

  • ์ž ๊ธˆ: ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ
  • ํŠธ๋žœ์žญ์…˜: ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ



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



  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ๊ณ ๋ฏผํ•ด์•ผ ํ•  ๋ฌธ์ œ๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ์•„์ฃผ ํ•„์ˆ˜์ ์ธ DBMS์˜ ๊ธฐ๋Šฅ
  • ์ž‘์—…์˜ ์™„์ „์„ฑ์„ ๋ณด์žฅํ•ด ์ฃผ๋Š” ๊ฒƒ
  • ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ์…‹์„ ๋ชจ๋‘ ์™„๋ฒฝํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ
    ์›์ƒํƒœ๋กœ ๋ณต๊ตฌํ•ด์„œ ์ž‘์—…์˜ ์ผ๋ถ€๋งŒ ์ ์šฉ๋˜๋Š” ํ˜„์ƒ(Partial update)์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ


  • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ : InnoDB
  • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ : MyISAM, MEMORY ๋“ฑ



โœ”๏ธ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ :
ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋˜๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ ์ž‘์—… ๋‚ด์šฉ์„
์–ด๋–ป๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์ฐจ๋‹จํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ ˆ๋ฒจ์„ ์˜๋ฏธํ•œ๋‹ค.



1.1 MySQL์—์„œ์˜ ํŠธ๋žœ์žญ์…˜



ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋“  ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋“  ๊ด€๊ณ„์—†์ด

  1. ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… set ์ž์ฒด๊ฐ€ 100% ์ ์šฉ๋˜๊ฑฐ๋‚˜(COMMIT์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ)
  2. ์•„๋ฌด๊ฒƒ๋„ ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผํ•จ(ROLLBACK ๋˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ROLLBACK์‹œํ‚ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ)
    ์„ ๋ณด์žฅํ•ด ์ฃผ๋Š” ๊ฒƒ



1.2 ์ฃผ์˜์‚ฌํ•ญ



  • ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฒ”์œ„์™€
    ํŠธ๋žœ์žญ์…˜์ด ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
    (์ตœ์†Œ์˜ ์ฝ”๋“œ์—๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ)

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ์—์„œ ๋ผ์ธ ์ˆ˜๋Š” ํ•œ๋‘ ์ค„์ด๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ๋„คํŠธ์›Œํฌ ์ž‘์—…์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š”
    ๋ฐ˜๋“œ์‹œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐฐ์ œํ•ด์•ผ ํ•จ


โžก๏ธ ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋กœ ์ธํ•ด DBMS ์„œ๋ฒ„๊ฐ€ ๋†’์€ ๋ถ€ํ•˜ ์ƒํƒœ๋กœ ๋น ์ง€๊ฑฐ๋‚˜
์œ„ํ—˜ํ•œ ์ƒํƒœ์— ๋น ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•„์š”



2 MySQL ์—”์ง„์˜ ์ž ๊ธˆ



MySQL์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž ๊ธˆ(๊ฑฐ์‹œ์  ๋ถ„๋ฅ˜)

  1. MySQL ์—”์ง„ ๋ ˆ๋ฒจ
    • MySQL ์„œ๋ฒ„์—์„œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„
  2. ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ
    • ๋ชจ๋“  ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋งŒ,
      ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ์€ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ฐ„ ์ƒํ˜ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š์Œ



MySQL ์—”์ง„ ์ž ๊ธˆ

  • ๊ธ€๋กœ๋ฒŒ๋ฝ
  • ํ…Œ์ด๋ธ”๋ฝ
  • ๋„ค์ž„๋“œ๋ฝ
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฝ



2.1 ๊ธ€๋กœ๋ฒŒ ๋ฝ(GLOBAL LOCK)



1
FLUSH TABLES WITH READ LOCK


InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์„ ๋ฉˆ์ถœ ํ•„์š”๋Š” ์—†๋‹ค.
MySQL 8.0๋ถ€ํ„ฐ๋Š” InnoDB๊ฐ€ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ ์ฑ„ํƒ๋˜๋ฉด์„œ ์กฐ๊ธˆ ๋” ๊ฐ€๋ฒผ์šด ๊ธ€๋กœ๋ฒŒ ๋ฝ์˜ ํ•„์š”์„ฑ์ด ์ƒ๊ฒผ๋‹ค.



  • ํ•œ ์„ธ์…˜์—์„œ ๊ธ€๋กœ๋ฒŒ ๋ฝ์„ ํš๋“ํ•˜๋ฉด
    ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ SELECT๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ DDL ๋ฌธ์žฅ์ด๋‚˜ DML ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ
    ๊ธ€๋กœ๋ฒŒ ๋ฝ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ๋ฌธ์žฅ์ด ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋‚จ์Œ


  • MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž ๊ธˆ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ๋ฒ”์œ„๊ฐ€ ํผ
  • ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฒ”์œ„๋Š” MySQL ์„œ๋ฒ„ ์ „์ฒด
  • ์ž‘์—… ๋Œ€์ƒ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นจ


  • ์‚ฌ์šฉ
    • ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” MyISAM์ด๋‚˜ MEMORY ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด
      mysqldump๋กœ ์ผ๊ด€๋œ ๋ฐฑ์—…์„ ๋ฐ›์•„์•ผ ํ•  ๋•Œ๋Š” ๊ธ€๋กœ๋ฒŒ ๋ฝ์„ ์‚ฌ์šฉ



โœ”๏ธ ๋ฐฑ์—…๋ฝ
MySQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Xtrabackup์ด๋‚˜ Enterprise Backup๊ณผ ๊ฐ™์€
๋ฐฑ์—… ํˆด๋“ค์˜ ์•ˆ์ •์ ์ธ ์‹คํ–‰์„ ์œ„ํ•ด ๋ฐฑ์—… ๋ฝ์ด ๋„์ž…

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



2.2 ํ…Œ์ด๋ธ” ๋ฝ(Table Lock)



  • ๊ฐœ๋ณ„ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์„ค์ •๋˜๋Š” ์ž ๊ธˆ
  • ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์ž ๊ธˆ
  • MyISAM๋ฟ ์•„๋‹ˆ๋ผ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”๋„ ๋™์ผํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ


  • ๋ช…์‹œ์  ๋˜๋Š” ๋ฌต์‹œ์ ์œผ๋กœ ํŠน์ • ํ…Œ์ด๋ธ”์˜ ๋ฝ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์Œ



๋ช…์‹œ์  ํ…Œ์ด๋ธ”๋ฝ



ํ…Œ์ด๋ธ”๋ฝ ๋ช…์‹œ์  ๋ช…๋ น์–ด

1
LOCK TABLES table_name [ READ | WRITE ]


  • UNLOCK TABLES ๋ช…๋ น์œผ๋กœ ์ž ๊ธˆ์„ ๋ฐ˜๋‚ฉ(ํ•ด์ œ)
  • ํŠน๋ณ„ํ•œ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†์Œ



๋ฌต์‹œ์  ํ…Œ์ด๋ธ”๋ฝ



  • MyISAM์ด๋‚˜ MEMORY ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐœ์ƒ
  • MySQL ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ํ…Œ์ด๋ธ”์— ์ž ๊ธˆ์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„,
    ์ฆ‰์‹œ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋จ
  • ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ž๋™์œผ๋กœ ํš๋“๋๋‹ค๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ ํ›„ ์ž๋™ ํ•ด์ œ
  • InnoDB ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ฐจ์›์—์„œ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋ฌต์‹œ์ ์ธ ํ…Œ์ด๋ธ” ๋ฝ์ด ์„ค์ •๋˜์ง€ ์•Š์Œ
    (InnoDB ํ…Œ์ด๋ธ”์—๋„ ํ…Œ์ด๋ธ” ๋ฝ์ด ์„ค์ •๋˜์ง€๋งŒ
    ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(DML) ์ฟผ๋ฆฌ์—์„œ๋Š” ๋ฌด์‹œ๋˜๊ณ  ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฌํ•˜๋Š” ์ฟผ๋ฆฌ(DDL)์˜ ๊ฒฝ์šฐ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นจ)



2.3 ๋„ค์ž„๋“œ ๋ฝ(Named Lock)



๋„ค์ž„๋“œ๋ฝ ํ•จ์ˆ˜

1
GET_LOCK() 


  • ์‚ฌ์šฉ์ž์˜ ํ•„์š”์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฝ
  • ์ž„์˜์˜ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด(String)์— ๋Œ€ํ•ด ํš๋“ํ•˜๊ณ  ๋ฐ˜๋‚ฉ(ํ•ด์ œ)ํ•˜๋Š” ์ž ๊ธˆ
  • ๋„ค์ž„๋“œ ๋ฝ์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์Œ


  • ์‚ฌ์šฉ
    • ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋ณต์žกํ•œ ์š”๊ฑด์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
    • ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒํ˜ธ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ
      (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ 1๋Œ€์— 5๋Œ€์˜ ์›น ์„œ๋ฒ„๊ฐ€ ์ ‘์†ํ•ด์„œ ์„œ๋น„์Šคํ•˜๋Š” ์ƒํ™ฉ์—์„œ
      5๋Œ€์˜ ์›น ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์ •๋ณด๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ์š”๊ฑด)



โœ”๏ธ MySQL 8.0 ๋ฒ„์ „

  • ๋„ค์ž„๋“œ ๋ฝ์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์„ธ์…˜์—์„œ ํš๋“ํ•œ ๋„ค์ž„๋“œ ๋ฝ์„ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ํ•ด์ œํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€


2.4 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ(Metadata Lock)์€



  • ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ์ž ๊ทธ๋Š” ๋ฝ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด(๋Œ€ํ‘œ์ ์œผ๋กœ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ทฐ ๋“ฑ)์˜ ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์— ํš๋“ํ•˜๋Š” ์ž ๊ธˆ
  • ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ํš๋“ํ•˜๋Š” ์ž ๊ธˆ
  • RENAME TABLE ๋ช…๋ น์˜ ๊ฒฝ์šฐ ์›๋ณธ ์ด๋ฆ„๊ณผ ๋ณ€๊ฒฝ๋  ์ด๋ฆ„ ๋‘ ๊ฐœ ๋ชจ๋‘ ํ•œ๊บผ๋ฒˆ์— ์ž ๊ธˆ์„ ์„ค์ •



3 InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ž ๊ธˆ



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



3.1 InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ์ž ๊ธˆ



  • ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • ์ผ๋ฐ˜ ์ƒ์šฉ DBMS์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ๋Š”
    ๋ ˆ์ฝ”๋“œ์™€ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋Š” ๊ฐญ(GAP) ๋ฝ์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌ



3.1.1 ๋ ˆ์ฝ”๋“œ ๋ฝ(Record lock, Record only lock)



  • ๋ ˆ์ฝ”๋“œ ์ž์ฒด๋งŒ์„ ์ž ๊ทธ๋Š” ๊ฒƒ
  • ๋‹ค๋ฅธ ์ƒ์šฉ DBMS์˜ ๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ
    InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ๋ ˆ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทผ๋‹ค๋Š” ์ฐจ์ด๋ฅผ ๊ฐ€์ง



3.1.2 ๊ฐญ ๋ฝ



  • ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ ˆ์ฝ”๋“œ์™€ ๋ฐ”๋กœ ์ธ์ ‘ํ•œ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ๋งŒ์„ ์ž ๊ทธ๋Š” ๊ฒƒ
  • ์ฝ”๋“œ์™€ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ(INSERT)๋˜๋Š” ๊ฒƒ์„ ์ œ์–ด



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



  • ๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์„ ํ•ฉ์ณ ๋†“์€ ํ˜•ํƒœ
  • InnoDB์˜ ๊ฐญ ๋ฝ์ด๋‚˜ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์€
    ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ ˆํ”Œ๋ฆฌ์นด ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๋•Œ
    ์†Œ์Šค ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด ๋‚ธ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ฃผ ๋ชฉ์ 
  • But ์˜์™ธ๋กœ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ๊ณผ ๊ฐญ ๋ฝ์œผ๋กœ ์ธํ•ด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜
    ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒ
    (๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํฌ๋งท์„ ROW ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด๋‚˜ ๊ฐญ ๋ฝ์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์Œ)



3.1.4 ์ž๋™ ์ฆ๊ฐ€ ๋ฝ



MySQL์—์„œ๋Š” ์ž๋™ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž ๊ฐ’์„ ์ถ”์ถœ(์ฑ„๋ฒˆ)ํ•˜๊ธฐ ์œ„ํ•ด
AUTO_INCREMENT๋ผ๋Š” ์นผ๋Ÿผ ์†์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.


AUTO_INCREMENT ์นผ๋Ÿผ์ด ์‚ฌ์šฉ๋œ ํ…Œ์ด๋ธ”์— ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ INSERT๋˜๋Š” ๊ฒฝ์šฐ,
์ €์žฅ๋˜๋Š” ๊ฐ ๋ ˆ์ฝ”๋“œ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๊ณ  ์ €์žฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ผ๋ จ๋ฒˆํ˜ธ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.


InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ AUTO_INCREMENT ๋ฝ(Auto increment lock)์ด๋ผ๊ณ  ํ•˜๋Š” ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•œ๋‹ค.



  • INSERT์™€ REPLACE ์ฟผ๋ฆฌ ๋ฌธ์žฅ๊ณผ ๊ฐ™์ด ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ๋งŒ ํ•„์š”
  • UPDATE๋‚˜ DELETE ๋“ฑ์˜ ์ฟผ๋ฆฌ์—์„œ๋Š” ๊ฑธ๋ฆฌ์ง€ ์•Š์Œ
  • ๋‹ค๋ฆ„ ์ž ๊ธˆ๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๊ณ„์—†์ด
    INSERT๋‚˜ REPLACE ๋ฌธ์žฅ์—์„œ AUTO_INCREMENT ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ˆœ๊ฐ„๋งŒ ๋ฝ์ด ๊ฑธ๋ ธ๋‹ค๊ฐ€ ์ฆ‰์‹œ ํ•ด์ œ



3.2 ์ธ๋ฑ์Šค์™€ ์ž ๊ธˆ



  • InnoDB์˜ ์ž ๊ธˆ์€
    ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
    ์ธ๋ฑ์Šค๋ฅผ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ
    (๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰ํ•œ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋ฝ์„ ๊ฑธ์–ด์•ผ ํ•จ)



์˜ˆ์‹œ

1
2
3
4
mysql> 
 UPDATE employees SET hire_date=NOW() 
                  WHERE first_name='Georgi' 
                        AND last_name='Klassen';


employees ํ…Œ์ด๋ธ”์—์„œ
first_name=โ€™Georgiโ€™์ด๊ณ 
last_name=โ€™Klassenโ€™์ธ ์‚ฌ์›์˜
์ž…์‚ฌ ์ผ์ž๋ฅผ ์˜ค๋Š˜๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๊ฒฝ์šฐ


โžก๏ธ first_name์ธ employee๊ฐ€ 200๋ช…์ด ๊ฒฝ์šฐ
โ€˜first_name=โ€™Georgiโ€™์ธ 200๊ฑด์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์ž ๊ธฐ๊ฒŒ ๋œ๋‹ค.


๋งŒ์•ฝ ์กฐ์ง์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์„œ โ€˜first_name=โ€™Georgiโ€™์ธ employee๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค๋ฉด
๊ฐ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋™์‹œ์„ฑ์ด ์ƒ๋‹นํžˆ ๋–จ์–ด์ ธ์„œ
ํ•œ ์„ธ์…˜์—์„œ UPDATE ์ž‘์—…์„ ํ•˜๋Š” ์ค‘์—๋Š”
๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ ํ…Œ์ด๋ธ”์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.



แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-04-07 แ„‹แ…ฉแ„’แ…ฎ 8 57 42


๋งŒ์•ฝ ์ด ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด
ํ…Œ์ด๋ธ”์„ ํ’€ ์Šค์บ”ํ•˜๋ฉด์„œ UPDATE ์ž‘์—…์„ ํ•˜๊ฒŒ๋œ๋‹ค.
์ด ๊ณผ์ •์—์„œ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๊ฒŒ ๋œ๋‹ค.
์ด๊ฒƒ์ด MySQL์˜ ๋ฐฉ์‹์ด๋ฉฐ, MySQL์˜ InnoDB์—์„œ ์ธ๋ฑ์Šค ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ  ๋˜ํ•œ ์ด ๋•Œ๋ฌธ์ด๋‹ค.


์ธ๋ฑ์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ’€์Šค์บ”ํ•˜์ง€ ์•Š๊ณ  UPDATE ํ•  ์ˆ˜ ์žˆ์Œ



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



ํ…Œ์ด๋ธ” ์ž ๊ธˆ์—์„œ๋Š” ์ž ๊ธˆ์˜ ๋Œ€์ƒ์ด ํ…Œ์ด๋ธ” ์ž์ฒด์ด๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋ฌธ์ œ์˜ ์›์ธ์ด ๋ฐœ๊ฒฌ๋˜๊ณ  ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€ ์ž ๊ธˆ์€
ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ๊ฐ๊ฐ์— ์ž ๊ธˆ์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๊ทธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด
์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์ž ๊ฒจ์ง„ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์–ด๋„ ์ž˜ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

MySQL 5.1๋ถ€ํ„ฐ๋Š” ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ๊ณผ ์ž ๊ธˆ ๋Œ€๊ธฐ์— ๋Œ€ํ•œ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ ธ
์ฟผ๋ฆฌ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์ž ๊ธˆ๊ณผ ์ž ๊ธˆ ๋Œ€๊ธฐ๋ฅผ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.


  1. ๊ธฐ์กด์˜ mysql
    ๊ฐ ํŠธ๋žœ์žญ์…˜์ด ์–ด๋–ค ์ž ๊ธˆ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€,
    ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ž ๊ธˆ์„ ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ
    ์‰ฝ๊ฒŒ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์กฐํšŒ ๊ฐ€๋Šฅ
  2. MySQL 5.1๋ถ€ํ„ฐ
    information_schema๋ผ๋Š” DB์—
    INNODB_TRX๋ผ๋Š” ํ…Œ์ด๋ธ”๊ณผ INNODB_LOCKS, INNODB_LOCK_WAITS๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ํ™•์ธ์ด ๊ฐ€๋Šฅ
  3. MySQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ
    information_schema์˜ ์ •๋ณด๋“ค์€ ์กฐ๊ธˆ์”ฉ ์ œ๊ฑฐ(Deprecated)๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ๋Œ€์‹  performance_schema์˜ data_locks์™€ data_lock_waits ํ…Œ์ด๋ธ”๋กœ ๋Œ€์ฒด


performance_schema์˜ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•ด ์ž ๊ธˆ๊ณผ ์ž ๊ธˆ ๋Œ€๊ธฐ ์ˆœ์„œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•



(์˜ˆ์‹œ)

1
2
3
4
5
6
7
8
mysql> SHOW PROCESSLIST;
+----+--------+----------+-----------------------------------------------------------+
| Id | Time | State | Info |
+----+--------+----------+-----------------------------------------------------------+
| 17 | 607 | | NULL |
| 18 | 22 | updating | UPDATE employees SET birth_date=NOW() WHERE emp_no=100001 |
| 19 | 21 | updating | UPDATE employees SET birth_date=NOW() WHERE emp_no=100001 |
+----+--------+----------+-----------------------------------------------------------+


  • 17๋ฒˆ ์Šค๋ ˆ๋“œ
    • ์ง€๊ธˆ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ์žˆ์Œ
    • ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  UPDATE ๋ช…๋ น์ด ์‹คํ–‰ ์™„๋ฃŒ๋œ ์ƒํƒœ
    • But ์•„์ง 17๋ฒˆ ์Šค๋ ˆ๋“œ๋Š” COMMIT์„ ์‹คํ–‰ํ•˜์ง€๋Š” ์•Š์€ ์ƒํƒœ๋กœ ์—…๋ฐ์ดํŠธํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์ž ๊ธˆ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ
  • 18๋ฒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ๋‹ค์Œ์œผ๋กœ UPDATE ๋ช…๋ น์„ ์‹คํ–‰
    • ์ž ๊ธˆ ๋Œ€๊ธฐ๋กœ ์ธํ•ด ์•„์ง UPDATE ๋ช…๋ น์„ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ
  • 19๋ฒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ๋‹ค์Œ์œผ๋กœ UPDATE ๋ช…๋ น์„ ์‹คํ–‰
    • ์ž ๊ธˆ ๋Œ€๊ธฐ๋กœ ์ธํ•ด ์•„์ง UPDATE ๋ช…๋ น์„ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ



(์˜ˆ์‹œ)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> 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;
+---------+---------+-------------------+----------+----------+-------------------+
| waiting | waiting | waiting_query | blocking | blocking | blocking_query |
| _trx_id | _thread | | _trx_id | _thread | |
+---------+---------+-------------------+----------+----------+-------------------+
| 11990 | 19 | UPDATE employees..| 11989 | 18 | UPDATE employees..|
| 11990 | 19 | UPDATE employees..| 11984 | 17 | NULL |
| 11989 | 18 | UPDATE employees..| 11984 | 17 | NULL |
+---------+---------+-------------------+----------+----------+-------------------+


17๋ฒˆ ์Šค๋ ˆ๋“œ๊ฐ€
๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๊ณ ,
18๋ฒˆ ์Šค๋ ˆ๋“œ๊ฐ€
๊ทธ ์ž ๊ธˆ์„ ํš๋“ํ•˜๊ณ ,
UPDATE๋ฅผ ์™„๋ฃŒํ•œ ํ›„,
์ž ๊ธˆ์„ ํ’€์–ด์•ผ
19๋ฒˆ ์Šค๋ ˆ๋“œ๊ฐ€
UPDATE๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ


  • waiting _thread
    :ํ˜„์žฌ ์–ด๋–ค ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์คŒ



17๋ฒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ์ž ๊ธˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๋” ์ƒ์„ธํžˆ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
๋‹ค์Œ๊ณผ ๊ฐ™์ด performance_schema์˜
data_locks ํ…Œ์ด๋ธ”์ด ๊ฐ€์ง„ ์นผ๋Ÿผ์„ ๋ชจ๋‘ ์‚ดํŽด๋ณด๋ฉด ๋œ๋‹ค.


1
2
 LOCK_TYPE: TABLE
 LOCK_MODE: IX

ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด IX ์ž ๊ธˆ(Intentional Exclusive)์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ


1
2
 LOCK_TYPE: RECORD
 LOCK_MODE: X,REC_NOT_GAP
  • ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ํŠน์ • ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • REC_NOT_GAP ํ‘œ์‹œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ
    ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ์€ ๊ฐญ์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ์ˆœ์ˆ˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์ž ๊ธˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ


๊ฐ•์ œ์ข…๋ฃŒ ๋ช…๋ น์–ด

1
2
mysql> 
KILL <์Šค๋ ˆ๋“œ ๋ฒˆํ˜ธ>;



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



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


ย DIRTY READNON-REPEATABLEPHANTOM READ
READ UNCOMMITTED๋ฐœ์ƒ๋ฐœ์ƒ๋ฐœ์ƒ
READ COMMITTED์—†์Œ๋ฐœ์ƒ๋ฐœ์ƒ
REPEATABLE READ์—†์Œ์—†์Œ๋ฐœ์ƒ
(InnoDB๋Š” ์—†์Œ)
SERIALIZABLE์—†์Œ์—†์Œ์—†์Œ


SQL-92 ๋˜๋Š” SQL-99 ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด
REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š”
PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
InnoDB์—์„œ๋Š” ๋…ํŠนํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์—
REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„
PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.


์‚ฌ์šฉ


  • ์ผ๋ฐ˜์ ์ธ ์˜จ๋ผ์ธ ์„œ๋น„์Šค ์šฉ๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    ์ฃผ๋กœ READ COMMITTED์™€ REPEATABLE READ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ
  • ์˜ค๋ผํด ๊ฐ™์€ DBMS
    ์ฃผ๋กœ READ COMMITTED ์ˆ˜์ค€์„ ์‚ฌ์šฉ
  • MySQL
    ์ฃผ๋กœ REPEATABLE READ ์ˆ˜์ค€์„ ์‚ฌ์šฉ



4.1 READ UNCOMMITTED(DIRTY READ)



  • ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ


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


  • RDBMS ํ‘œ์ค€์—์„œ๋Š”
    ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
    (MySQL์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ตœ์†Œํ•œ READ COMMITTED ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅ)


  • ๋”ํ‹ฐ ๋ฆฌ๋“œ(Dirty read)
    • ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค ํ•˜๋Š” ํ˜„์ƒ์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ
      ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ๋‹นํžˆ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ฆ


๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ๋ชจ์ˆœ ์—†์ด ์ผ๊ด€๋˜๊ฒŒ ์ผ์น˜ํ•ด์•ผ ํ•จ
  • ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ผ๋ฆฌ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๊ธฐ ์–ด๋ ค์›€
  • ๋น„์ •๊ทœํ˜•์„ ์‚ฌ์šฉํ•ด ์•„๋…ธ๋ง๋ฆฌ (anomaly : ์ด์ƒํ˜„์ƒ)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง
    (์ •ํ•ฉ์„ฑ ํ›ผ์†์˜ ์˜ˆ์‹œ) โ€œ์ˆ ์€ ๋งˆ์…จ์ง€๋งŒ, ์Œ์ฃผ์šด์ „์€ ํ•˜์ง€ ์•Š์•˜๋‹ค.โ€



4.2 READ COMMITTED



์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋”๋ผ๋„
COMMIT์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ.


  • ์˜ค๋ผํด DBMS์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
  • ์˜จ๋ผ์ธ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์„ ํƒ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
  • ๋”ํ‹ฐ ๋ฆฌ๋“œ(Dirty read) ๊ฐ™์€ ํ˜„์ƒ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ


  • ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์ด ์ปค๋ฐ‹๋˜์ง€ ์ „๊นŒ์ง€๋Š”
    ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ทธ๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
    ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด์—ฌ์คŒ
    (์ปค๋ฐ‹ํ•˜๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ์ƒˆ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ)


  • NON-REPEATABLE READ (๋ถ€์ •ํ•ฉ์˜ ๋ฌธ์ œ)
    • REPEATABLE READ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
      SELECT ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ



ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” SELECT๋ฌธ / ํŠธ๋žœ์žญ์…˜ ์—†์ด ์‹คํ–‰๋˜๋Š” SELECT๋ฌธ


READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

  • ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” SELECT ๋ฌธ์žฅ๊ณผ
    ํŠธ๋žœ์žญ์…˜ ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” SELECT ๋ฌธ์žฅ์˜
    ์ฐจ์ด๊ฐ€ ๋ณ„๋กœ ์—†๋‹ค.


REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

  • ๊ธฐ๋ณธ์ ์œผ๋กœ SELECT ์ฟผ๋ฆฌ ๋ฌธ์žฅ๋„ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์ž‘๋™
    (START TRANSACTION(๋˜๋Š” BEGIN) ๋ช…๋ น์œผ๋กœ
    ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ์ƒํƒœ์—์„œ ์˜จ์ข…์ผ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰ํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚จ
    (๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  COMMIT์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ๋„ ๋™์ผ))



4.3 REPEATABLE READ



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


  • MVCC๋ฅผ ์œ„ํ•ด
    ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด
    ๋™์ผ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋ณด์žฅ
  • REPEATABLE READ์™€ READ COMMITTED ๋ชจ๋‘
    MVCC๋ฅผ ์ด์šฉํ•ด COMMIT๋˜๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ ,
    ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์˜ ๋ฒ„์ „ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.


MVCC(Multi Version Concurrency Control) ๋ณ€๊ฒฝ๋ฐฉ์‹ :
InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํŠธ๋žœ์žญ์…˜์ด ROLLBACK๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€๋น„ํ•ด ๋ณ€๊ฒฝ๋˜๊ธฐ
์ „ ๋ ˆ์ฝ”๋“œ๋ฅผ ์–ธ๋‘(Undo) ๊ณต๊ฐ„์— ๋ฐฑ์—…ํ•ด๋‘๊ณ  ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝ


InnoDB์˜ ํŠธ๋žœ์žญ์…˜

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


ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฐฑ์—…์ด ํ•˜๋‚˜ ์ด์ƒ ์–ผ๋งˆ๋“ ์ง€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ BEGIN์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ 
์žฅ์‹œ๊ฐ„ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด
์–ธ๋‘ ์˜์—ญ์ด ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ฌดํ•œ์ • ์ปค์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์–ธ๋‘์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด MySQL ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.


๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ

  • MySQL ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ์˜ ์„ธํŠธ
  • ์—๋Ÿฌ์ฝ”๋“œ, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ์ž์ฒด์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์ด ํฌํ•จ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ Transaction Commit ์‹œ์— ๊ธฐ๋ก๋˜์–ด์ง€๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ



4.4 SERIALIZABLE



  • ๋™์‹œ์„ฑ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉด์„œ ๋™์‹œ์— ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
  • ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๋ณด๋‹ค ๋–จ์–ด์ง
  • ์ฝ๊ธฐ ์ž‘์—…๋„ ๊ณต์œ  ์ž ๊ธˆ(์ฝ๊ธฐ ์ž ๊ธˆ)์„ ํš๋“ํ•ด์•ผ๋งŒ ํ•˜๋ฉฐ,
    ๋™์‹œ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•จ
    ( ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ)
  • ์ผ๋ฐ˜์ ์ธ DBMS์—์„œ ์ผ์–ด๋‚˜๋Š” โ€œPHANTOM READโ€๋ฌธ์ œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ



โ€”

(์ฐธ๊ณ )



๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์—ฌ๋Ÿฌ๊ธ€๊ณผ ์ฑ… ์ฝ์€ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ข‹์€ ๊ธ€๋กœ ์ €์˜ ๊ณต๋ถ€์— ๋„์›€์„ ์ฃผ์‹œ๋Š” ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

โ—ERROR - EC2 ์†๋„ ์ €ํ•˜๋กœ ์„œ๋ฒ„ ์ ‘์† ๋ถˆ๊ฐ€

/docker/ Docker ๊ธฐ์ดˆ ์ด๋ก