SELECT Lock

일반적인 SELECT 쿼리 μ‹€ν–‰ μ‹œμ—λŠ” μž κΈˆμ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  데이터λ₯Ό μ½μ§€λ§Œ(Non-locking Consistent Read), 데이터 μ •ν•©μ„± 보μž₯을 μœ„ν•΄ λͺ…μ‹œμ μœΌλ‘œ μž κΈˆμ„ μ„€μ •ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

잠금 μ’…λ₯˜
μ„€λͺ…
곡유 잠금 νšλ“
배타적 잠금 νšλ“
λΉ„κ³ 

FOR SHARE 곡유 잠금 (S-Lock)

μ‘°νšŒν•œ λ ˆμ½”λ“œμ— 곡유 잠금 μ„€μ •

ν—ˆμš©

λ°©μ§€

데이터가 λ³€κ²½λ˜λ©΄ μ•ˆ λ˜λŠ” μƒν™©μ—μ„œ μΌκ΄€λœ 읽기λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

FOR UPDATE 배타적 잠금 (X-Lock)

μ‘°νšŒν•œ λ ˆμ½”λ“œμ— 배타적 잠금 μ„€μ •

λ°©μ§€

λ°©μ§€

μ‘°νšŒν•œ 데이터λ₯Ό κ³§λ°”λ‘œ μˆ˜μ •ν•  μ˜λ„κ°€ μžˆμŒμ„ λͺ…μ‹œν•˜κ³ , λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ 접근을 μ™„μ „νžˆ μ°¨λ‹¨ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

InnoDB μŠ€ν† λ¦¬μ§€ μ—”μ§„μ—μ„œλŠ” 잠금 μ—†λŠ” 읽기가 μ§€μ›λ˜κΈ° λ•Œλ¬Έμ— 배타적 잠금이 μ„€μ •λ˜μ–΄μžˆλ”λΌλ„, λ‹¨μˆœSELECT μΏΌλ¦¬λŠ” μ •μƒμ μœΌλ‘œ 읽기λ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.

잠금 λ™μž‘ μ œμ–΄

잠금 ν…Œμ΄λΈ” 선택

μ—¬λŸ¬ ν…Œμ΄λΈ”μ„ 쑰인할 λ•Œ, FOR UPDATEλŠ” 기본적으둜 쑰인에 ν¬ν•¨λœ λͺ¨λ“  ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œμ— μž κΈˆμ„ μ„€μ •ν•œλ‹€.

SELECT *
FROM employees e
         INNER JOIN dept_emp de ON de.emp_no = employees.emp_no
         INNER JOIN departments d ON d.dept_no = de.dept_no
    FOR
UPDATE;

이 쀑 νŠΉμ • ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œμ—λ§Œ μž κΈˆμ„ μ„€μ •ν•˜κ³  μ‹Άλ‹€λ©΄ OF μ ˆμ„ μ‚¬μš©ν•  수 μžˆλ‹€.

SELECT *
FROM employees e
         INNER JOIN dept_emp de ON de.emp_no = employees.emp_no
         INNER JOIN departments d ON d.dept_no = de.dept_no
    FOR
UPDATE OF e;

잠금 λŒ€κΈ° μ œμ–΄

잠금이 μ„€μ •λœ λ ˆμ½”λ“œλ₯Ό λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 이미 μž κΈˆν•˜κ³  μžˆλŠ” 경우, κΈ°λ³Έμ μœΌλ‘œλŠ” ν•΄λ‹Ή λ ˆμ½”λ“œμ˜ 잠금이 ν•΄μ œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜κ²Œ λ˜μ§€λ§Œ, λŒ€κΈ° λ™μž‘μ„ μ œμ–΄ν•  수 μžˆλŠ” μ˜΅μ…˜μ΄ μžˆλ‹€.

  • NOWAIT: 잠긴 λ ˆμ½”λ“œλ₯Ό λ§Œλ‚¬μ„ λ•Œ λŒ€κΈ°ν•˜μ§€ μ•Šκ³ , μ¦‰μ‹œ 였λ₯˜λ₯Ό λ°˜ν™˜

  • SKIP LOCKED: 잠긴 λ ˆμ½”λ“œλ₯Ό λ§Œλ‚¬μ„ λ•Œ, ν•΄λ‹Ή λ ˆμ½”λ“œλ₯Ό κ²°κ³Όμ—μ„œ μ œμ™Έν•˜κ³  κ±΄λ„ˆλ›°μ–΄ μž κΈ°μ§€ μ•Šμ€ λ‹€μŒ λ ˆμ½”λ“œλΆ€ν„° 쑰회λ₯Ό 계속

SKIP LOCKED ν™œμš©ν•œ μž‘μ—… 큐(Queue) κ΅¬ν˜„ μ˜ˆμ‹œ

NOWAIT와 SKIP LOCKED κΈ°λŠ₯은 큐(Queue)와 λΉ„μŠ·ν•œ κΈ°λŠ₯을 MySQL μ„œλ²„μ—μ„œ κ΅¬ν˜„ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

  • ν•˜λ‚˜μ˜ 쿠폰은 ν•œ μ‚¬μš©μžλ§Œ μ‚¬μš© κ°€λŠ₯

  • 쿠폰의 κ°œμˆ˜λŠ” 1000개 μ œν•œ

  • μ„ μ°©μˆœμœΌλ‘œ μš”μ²­ν•œ μ‚¬μš©μžμ—κ²Œ λ°œκΈ‰

μœ„ 쿼리λ₯Ό λ™μ‹œμ— 1000λͺ…μ˜ μ‚¬μš©μžκ°€ μš”μ²­ν•˜κ²Œ 되면 λ‹€μŒκ³Ό 같은 상황이 λ°œμƒν•œλ‹€.

  1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λŠ” κ·Έ μš”μ²­λ§ŒνΌ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성해 μœ„μ˜ νŠΈλžœμž­μ…˜μ„ λ™μ‹œμ— μ‹€ν–‰

  2. ν•˜μ§€λ§Œ κ°€μž₯ 첫 νŠΈλžœμž­μ…˜λ§Œ FOR UPDATE 쿼리둜 인해 μž κΈˆμ„ κ±Έκ³  λ‚˜λ¨Έμ§€ 999개의 νŠΈλžœμž­μ…˜μ€ ν•΄λ‹Ή λ ˆμ½”λ“œκ°€ 잠겨져 있기 λ•Œλ¬Έμ— λŒ€κΈ°

  3. λŒ€κΈ° μ‹œκ°„ λ™μ•ˆ μž κΈˆμ„ νšλ“ν•˜μ§€ λͺ»ν•΄μ„œ μ—λŸ¬λ₯Ό λ°˜ν™˜

μ—¬κΈ°μ„œ SKIP LOCKEDλ₯Ό μ‚¬μš©ν•˜λ©΄, ν•œ νŠΈλžœμž­μ…˜μ΄ νŠΉμ • 쿠폰을 μž κ·Έλ”λΌλ„ λ‹€λ₯Έ νŠΈλžœμž­μ…˜λ“€μ€ ν•΄λ‹Ή λ ˆμ½”λ“œλ₯Ό μ¦‰μ‹œ κ±΄λ„ˆλ›°κ³  λ‹€μŒ μž κΈ°μ§€ μ•Šμ€ 쿠폰을 μ‘°νšŒν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆλ‹€.

Skip Locked μ‚¬μš©μ— λ”°λ₯Έ νŠΈλžœμž­μ…˜ λŒ€κΈ°

참고자료

Last updated

Was this helpful?