week9_incheol_4 - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

db lock μ’…λ₯˜μ— λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€

MySQL λ™μ‹œμ„± μ œμ–΄, μ„œλ²„ νŠœλ‹, νŒŒν‹°μ…˜, SQL ν™œμš©

λ™μ‹œμ„± μ œμ–΄

  • MySQL 은 Lock κ³Ό νŠΈλžœμž­μ…˜μœΌλ‘œ λ™μ‹œμ„±μ„ μ œμ–΄
  • MySQL Lock λ§€μ»€λ‹ˆμ¦˜
    • μ“°λ ˆλ“œκ°€ 데이터 집합을 μš”μ²­ν•  λ•Œ Lock μ„€μ •
    • 데이터 집합은 ν…Œμ΄λΈ”, ν–‰, νŽ˜μ΄μ§€, 메타데이타
    • μ“°λ ˆλ“œκ°€ 데이터 집합 처리 μ™„λ£Œν•˜λ©΄ Lock ν•΄μ œ
  • MySQL νŠΈλžœμž­μ…˜
    • μ‹ λ’°μ„± 있게 μ²˜λ¦¬λ˜λŠ” 일의 λ‹¨μœ„

Lock

  • 읽기 Lock
    • R λ§Œ κ°€λŠ₯ CUD λΆˆκ°€
  • μ“°κΈ° Lock
    • CRUD λΆˆκ°€

Lock μ’…λ₯˜

  • Table Lock
    • ν…Œμ΄λΈ” 전체에 Lock을 κ±ΈκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή ν…Œμ΄λΈ”μ— μ ‘κ·Ό λΆˆκ°€
  • Row Lock
    • ν•˜λ‚˜ μ΄μƒμ˜ κ°œλ³„적인 행에 Lock
    • Lock이 걸리지 μ•Šμ€ 행에 μ ‘κ·Ό κ°€λŠ₯
  • Page Lock
    • BDB λΌλŠ” μŠ€ν† λ¦¬μ§€ 엔진에 적용.
    • 거의 μ‚¬μš©λ˜μ§€ μ•ŠμŒ
  • Metadata Lock
    • μ“°λ ˆλ“œκ°€ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•  λ•Œ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  메타데이터에 Lock
    • λ©”νƒ€ν…Œμ΄ν„°λž€, DDL 에 μ˜ν•΄ λ³€κ²½λ˜λŠ” 정보

ν…Œμ΄λΈ” Lock

  • MyISAM μŠ€ν† λ¦¬μ§€ μ—”μ§„μ—μ„œ μ‚¬μš©
  • μŠ€ν† λ¦¬μ§€ 엔진과 λ¬΄κ΄€ν•˜κ²Œ LOCK TABLE λͺ…λ ΉμœΌλ‘œ Lock κ°€λŠ₯
  • v5.5 μ΄μƒμ—μ„œ DDL μ‹€ν–‰ μ‹œ Lock λ°œμƒ

ν–‰ Lock

  • ν…Œμ΄λΈ” 전체가 μ•„λ‹Œ 일뢀 행에 lock
  • InnoDB λŠ” ν–‰ lock

ν–‰ lock

create table my_inno_t( id int auto_increment primary key, name varchar(10) ); insert into my_inno_t(name) values('a'); insert into my_inno_t(name) values('b'); insert into my_inno_t(name) values('c'); select * from my_inno_t; update my_inno_t set name = sleep(200) where id = 1; # 200초 걸림

λ‹€λ₯Έ μ„Έμ…˜ μ—΄κ³  select * from my_inno_t; ν•˜λ©΄ κ°€λŠ₯ update my_inno_t set name='aaa' where id=1; ν•˜λ©΄ λΆˆκ°€λŠ₯ ν–‰μ— lock 이 κ±Έλ €μ„œ

νŠΈλžœμž­μ…˜

  • MySQL 은 μŠ€ν† λ¦¬μ§€ 엔지 레벨으둜 νŠΈλžœμž­μ…˜
    • select @@autocommit; μœΌλ‘œ νŠΈλžœμž¬μ…˜ μ‚¬μš© μ—¬λΆ€ 확인
  • MySQL νŠΈλžœμž­μ…˜
    • start transaction; or begin; μœΌλ‘œ νŠΈλžœμž­μ…˜ μ‹œμž‘
    • commit; μœΌλ‘œ μˆ˜ν–‰ μ™„λ£Œ
    • rollback μœΌλ‘œ μˆ˜ν–‰ μ·¨μ†Œ