Skip to content
This repository was archived by the owner on Jun 14, 2022. It is now read-only.

Latest commit

Β 

History

History
67 lines (35 loc) Β· 6.63 KB

File metadata and controls

67 lines (35 loc) Β· 6.63 KB

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

κ°œμš”

μ—¬λŸ¬ μž₯λΉ„μ—μ„œ λŒμ•„κ°€λŠ” κ²Œμž„ μ„œλ²„λ“€μ΄ 같은 데이터λ₯Ό λ³€κ²½ν•˜λ €κ³  κ²½μŸν•˜λŠ” μƒν™©μ—μ„œλŠ 데이터 무결성을 보μž₯ν•˜κΈ° 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€. DBMSλ₯Ό 단 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•œλ‹€λ©΄ DBMSκ°€ μ œκ³΅ν•˜λŠ” νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μ΄μš©ν•˜λ©΄ λ˜μ§€λ§Œ, μ—¬λŸ¬ DBMS μž₯비에 λ‚˜λˆ„μ–΄ μ €μž₯λ˜μ–΄ μžˆλŠ” 데이터λ₯Ό ν•¨κ»˜ λ³€κ²½ν•˜λ©΄μ„œ 데이터 무결성을 μœ μ§€ν•˜λ €λ©΄ λŒ€λ‹¨νžˆ λΉ„μš©μ΄ 많이 λ“­λ‹ˆλ‹€.

싀버바인 μ„œλ²„ μ—”μ§„ 2λŠ” 잠금(lock) 기반 비관적 동기화λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 엔진이 μ œκ³΅ν•˜λŠ” APIλ₯Ό μ‚¬μš©ν•΄μ„œ ν”„λ‘œκ·Έλž˜λ°ν•˜λ©΄, 데이터 무결성을 μœ μ§€ν•˜λ©΄μ„œ μ—¬λŸ¬ λ„νλ¨ΌνŠΈμ™€ κΈ€λ‘œλ²Œ ν…Œμ΄λΈ”μ— 흩어져 μžˆλŠ” 데이터λ₯Ό ν•¨κ»˜ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

잠금 λ‹¨μœ„

  • λ„νλ¨ΌνŠΈ ν•˜λ‚˜ν•˜λ‚˜κ°€ 잠금 λ‹¨μœ„μž…λ‹ˆλ‹€.
  • 각 κΈ€λ‘œλ²Œ ν…Œμ΄λΈ”μ˜ ν‚€ ν•˜λ‚˜ν•˜λ‚˜κ°€ 잠금 λ‹¨μœ„μž…λ‹ˆλ‹€.

β€» λ„νλ¨ΌνŠΈ μ•ˆμ— λ“€μ–΄μžˆλŠ” νŠΉμ • λ°μ΄ν„°λ§Œμ„ μž κΈ€ μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.
β€» κΈ€λ‘œλ²Œ ν…Œμ΄λΈ”μ— μ–΄λ–€ ν‚€λ₯Ό κ°–λŠ” 행이 아직 μ‘΄μž¬ν•˜μ§€ μ•Šλ”λΌλ„, κ·Έ ν‚€λ₯Ό μž κΈ€ 수 μžˆμŠ΅λ‹ˆλ‹€.
β€» 아직 μƒμ„±ν•˜μ§€ μ•Šμ€ λ„νλ¨ΌνŠΈλŠ” μž κΈ€ 수 μ—†μŠ΅λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜ κ³Όμ •

데이터λ₯Ό 읽고쓰기 μœ„ν•΄μ„œλŠ” Transaction 객체λ₯Ό 톡해야 ν•©λ‹ˆλ‹€. 아직 μž κΈˆμ„ νšλ“ν•˜μ§€ μ•Šμ€ 데이터에 μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ 엔진이 이λ₯Ό κ°μ§€ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λ―€λ‘œ, μ–΄λ–€ 데이터λ₯Ό κ±΄λ“œλ¦΄ 것인지 Transaction 객체에 미리 μ•Œλ €μ€˜μ•Ό ν•©λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•  λ•Œ κ·Έ νŠΈλžœμž­μ…˜μ΄ κ±΄λ“œλ¦΄ μ˜ˆμ •μΈ λͺ¨λ“  잠금 λ‹¨μœ„(λ„νλ¨ΌνŠΈ id, κΈ€λ‘œλ²Œ ν…Œμ΄λΈ” ν‚€)λ₯Ό Transaction 객체에 μ „λ‹¬ν•˜μ—¬ μž κΈˆμ„ νšλ“ν•©μ‹œλ‹€. 이 μž κΈˆμ€ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€μ— μ°Έμ—¬ν•˜λŠ” λͺ¨λ“  κ²Œμž„μ„œλ²„κ°€ ν•¨κ»˜ κ΄€λ¦¬ν•˜λŠ” κ²ƒμœΌλ‘œ, μž κΈˆμ„ νšλ“ν•œ νŠΈλžœμž­μ…˜μ΄ λλ‚˜κΈ° μ „κΉŒμ§€λŠ” 잠근 데이터λ₯Ό λ‹€λ₯Έ κ³³μ—μ„œ κ±΄λ“œλ¦΄ 수 μ—†μŠ΅λ‹ˆλ‹€.

Transaction 객체λ₯Ό 톡해 데이터λ₯Ό 읽고 λ³€κ²½ν•˜λŠ”λ°, 이 λ‚΄μš©μ€ μ‹€μ œ μ €μž₯μ†Œμ— μ¦‰μ‹œ λ°˜μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 무엇을 μ–΄λ–»κ²Œ λ³€κ²½ν• μ§€ λͺ¨λ“  λ‚΄μš©μ„ κ²°μ •ν•˜κ³  λ‚˜μ„œ Commit()을 ν˜ΈμΆœν•΄μ•Όλ§Œ λΉ„λ‘œμ†Œ 엔진이 DBMS에 쿼리λ₯Ό λ°œμ†‘ν•©λ‹ˆλ‹€.

μ—¬λŸ¬ 개의 잠금 νšλ“ν•˜κΈ°

ν•˜λ‚˜μ˜ LockSpec 객체에 μ—¬λŸ¬ 잠금 λ‹¨μœ„λ₯Ό ν•œκΊΌλ²ˆμ— μ§€μ •ν•˜μ—¬ μž κΈˆμ„ νšλ“ν•˜λŠ” 경우, 엔진이 LockEscalationOrderλ₯Ό 따라 잠금 μˆœμ„œλ₯Ό μžλ™μœΌλ‘œ μ •λ ¬ν•΄μ„œ νšλ“ν•΄μ€λ‹ˆλ‹€. μ–΄λ–€ 데이터λ₯Ό κ±΄λ“œλ¦΄μ§€ 미리 μ•Œκ³  μžˆλŠ” 경우, νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•  λ•Œ 이와 같은 λ°©λ²•μœΌλ‘œ κ·Έ νŠΈλžœμž­μ…˜μ΄ κ±΄λ“œλ¦΄ 수 μžˆλŠ” λͺ¨λ“  λŒ€μƒμ„ 엔진에 μ•Œλ €μ£ΌλŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ κΈ€λ‘œλ²Œ ν…Œμ΄λΈ”μ„ μ‘°νšŒν•΄μ„œ κ·Έλ‘œλΆ€ν„° λ„νλ¨ΌνŠΈ idλ₯Ό μ–»λŠ” λ“±, μ–΄λ–€ 데이터λ₯Ό κ±΄λ“œλ¦΄μ§€ νŠΈλžœμž­μ…˜μ„ 일뢀 μ§„ν–‰ν•΄μ•Όλ§Œ μ•Œκ²Œ λ˜λŠ” κ²½μš°μ—λŠ” νŠΈλžœμž­μ…˜ 쀑간에 μž κΈˆμ„ μΆ”κ°€λ‘œ νšλ“ν•΄μ•Ό ν•©λ‹ˆλ‹€. 단, κ²Œμž„ μ „μ²΄μ—μ„œ 일관성 μžˆλŠ” μˆœμ„œλ‘œ μž κΈˆμ„ νšλ“ν•œλ‹€λŠ” 것을 보μž₯ν•˜κΈ° μœ„ν•΄, 잠금 μΆ”κ°€ νšλ“μ΄ κ°€λŠ₯ν•œ 관계λ₯Ό 미리 .schema νŒŒμΌμ— λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€. μƒ˜ν”Œμ—μ„œ LockEscalationOrderλ₯Ό 검색해 λ³΄μ„Έμš”.

.schema νŒŒμΌμ—μ„œ λͺ…μ‹œμ μœΌλ‘œ ν—ˆμš©ν•˜μ§€ μ•Šμ€ μˆœμ„œλ‘œ μž κΈˆμ„ μΆ”κ°€λ‘œ νšλ“ν•˜λ €κ³  μ‹œλ„ν•˜λ©΄ 엔진이 이λ₯Ό κ°μ§€ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. 이것은 λ°λ“œλ½μ„ λ°©μ§€ν•˜κΈ° μœ„ν•œ μž₯μΉ˜μž…λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ λ„νλ¨ΌνŠΈλ₯Ό μΆ”κ°€ν•  λ•Œ

νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ λ„νλ¨ΌνŠΈλ₯Ό μƒˆλ‘œ μƒμ„±ν•˜λ©΄ LockEscalationOrder μ„€μ •κ³Ό λ¬΄κ΄€ν•˜κ²Œ μžλ™μœΌλ‘œ μž κΈˆμ„ νšλ“ν•©λ‹ˆλ‹€. μƒˆλ‘œ μƒμ„±ν•œ λ„νλ¨ΌνŠΈμ˜ idλ₯Ό λ‹€λ₯Έ 곳으둜 μ „λ‹¬ν•˜μ—¬ λ³„λ„μ˜ νŠΈλžœμž­μ…˜μ—μ„œ μž κΈˆμ„ νšλ“ν•˜λ €κ³  μ‹œλ„ν•˜μ§€ μ•ŠλŠ” 이상 λ°λ“œλ½μ΄ 일어날 κ°€λŠ₯성은 μ—†κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έμ μœΌλ‘œ 이런 κ·œμΉ™μ„ ν—ˆμš©ν–ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ, νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μƒˆλ‘œ μƒμ„±ν•œ λ„νλ¨ΌνŠΈμ˜ idλŠ” νŠΈλžœμž­μ…˜μ΄ λλ‚˜κΈ° μ „μ—λŠ” λ‹€λ₯Έ κ³³μ—μ„œ μ•Œ 수 없도둝 ν•˜μ‹­μ‹œμ˜€.

μž κΈˆμ€ κ°€λŠ₯ν•œ ν•œ λ°”κΉ₯μ—μ„œ νšλ“ν•˜μ‹­μ‹œμ˜€

μ§κ΄€μ μœΌλ‘œ μ΄ν•΄ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆλŠ” λ‚΄μš©μ΄λ‚˜, 저희λ₯Ό λ―ΏμœΌμ‹­μ‹œμ˜€. ν•„μš”ν•œ μž κΈˆμ„ κ·Έλ•Œκ·Έλ•Œ νšλ“ν•˜λ„λ‘ 둜직 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ‹œλ©΄ μ§€μ˜₯문이 열릴 κ²ƒμž…λ‹ˆλ‹€.

호좜 'λ˜λŠ”' ν•¨μˆ˜μ—μ„œλŠ” μ›ν•˜λŠ” λ°μ΄ν„°μ˜ μž κΈˆμ„ 이미 νšλ“ν•œ μƒνƒœλΌκ³  κ°€μ •ν•˜κ³  ν”„λ‘œκ·Έλž˜λ°ν•˜μ…”μ•Ό ν•©λ‹ˆλ‹€. 엔진이 잠금 νšλ“ μ—¬λΆ€λ₯Ό 검사해쀄 κ²ƒμ΄λ‹ˆ 확인 μž‘μ—…μ€ 엔진에 λ§‘κΈ°μ‹œλ©΄ λ©λ‹ˆλ‹€. 잠금 νšλ“μ€ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œ λ°”λ‘œ κ·Έ 호좜 깊이, ν˜Ήμ€ ν•œ 단계 μ•ˆ μ •λ„μ—μ„œλ§Œ μΌμ–΄λ‚˜μ•Ό ν•©λ‹ˆλ‹€.

ν•„μš”ν•œ μž κΈˆμ„ 직접 νšλ“ν•˜λŠ” μ½”λ“œλŠ” 자유둭게 뢈러 μ“°κΈ° λŒ€λ‹¨νžˆ μ–΄λ ΅μŠ΅λ‹ˆλ‹€(composableν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€). 일반적으둜 이런 μ½”λ“œλŠ” λ°λ“œλ½μ„ μœ λ°œν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. 싀버바인 μ„œλ²„μ—”μ§„ 2의 DB μž κΈˆμ€ νšλ“ μˆœμ„œλ₯Ό μ—”μ§„μ—μ„œ 검사해 μ£Όλ―€λ‘œ μ‹€μ œλ‘œλŠ” λ°λ“œλ½ λŒ€μ‹  개발 λ‹¨κ³„μ—μ„œ LockEscalationOrder μœ„λ°˜ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€λ§Œ μ•ˆμ‹¬ν•˜μ‹œλ©΄ μ•ˆλ©λ‹ˆλ‹€. λ°λ“œλ½μ€ μΌμ–΄λ‚˜μ§€ μ•Šλ”λΌλ„ μœ μ§€λ³΄μˆ˜ν•˜κΈ° λŒ€λ‹¨νžˆ μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜μ΄ 보μž₯ν•˜λŠ” λ‚΄μš©

  • ν•˜λ‚˜μ˜ λ„νλ¨ΌνŠΈμ— λŒ€ν•œ 변경은 DBMS νŠΈλžœμž­μ…˜μ„ μ΄μš©ν•΄μ„œ μ›μžμ μœΌλ‘œ μΌμ–΄λ‚©λ‹ˆλ‹€.
  • ν•˜λ‚˜μ˜ κΈ€λ‘œλ²Œ ν…Œμ΄λΈ” 킀에 λŒ€ν•œ 변경도 DBMS νŠΈλžœμž­μ…˜μ„ μ΄μš©ν•΄μ„œ μ›μžμ μœΌλ‘œ μΌμ–΄λ‚©λ‹ˆλ‹€.
  • DBMSκ°€ 비정상 μ’…λ£Œλ˜κ±°λ‚˜, νŠΈλžœμž­μ…˜μ„ μ‹€ν–‰ν•˜λŠ” κ²Œμž„μ„œλ²„κ°€ 비정상 μ’…λ£Œλ˜κ±°λ‚˜, κ²Œμž„μ„œλ²„μ™€ DBMS κ°„μ˜ 연결이 λΉ„μ •μƒμ μœΌλ‘œ λŠκΈ°λŠ” 경우, 전체 νŠΈλžœμž­μ…˜μ—μ„œ 일뢀 락 λ‹¨μœ„μ˜ 변경사항은 λˆ„λ½λ˜κ³  μΌλΆ€λ§Œ 컀밋될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
  • μœ„ ν•­λͺ©μ—μ„œ μ–ΈκΈ‰ν•œ 경우λ₯Ό μ œμ™Έν•˜λ©΄ Transaction 객체λ₯Ό 톡해 μ»€λ°‹ν•œ λ‚΄μš©μ€ λͺ¨λ‘ μ•ˆμ „ν•˜κ²Œ μ €μž₯λ©λ‹ˆλ‹€.

높은 보호 μˆ˜μ€€μ˜ νŠΈλžœμž­μ…˜ (λ―Έκ΅¬ν˜„)

μ •μ „ λ“±μ˜ 상황에도 νŠΈλžœμž­μ…˜μ˜ μΌλΆ€λΆ„λ§Œ μ»€λ°‹λ˜λŠ” κ²½μš°κ°€ 없도둝 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, 변경사항 전체가 μ»€λ°‹λ˜κ±°λ‚˜ μ•„λ‹ˆλ©΄ 아무것도 μ»€λ°‹λ˜μ§€ μ•ŠμŒμ„ 보μž₯ν•˜κ²Œ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 데이터 무결성이 κΉ¨μ§€λŠ” 일은 μ€„μ–΄λ“€μ§€λ§Œ κΈ°λ³Έ 보호 μˆ˜μ€€λ³΄λ‹€ DB에 λΆ€ν•˜λ₯Ό 더 κ°€ν•˜κ³  νŠΈλžœμž­μ…˜ 컀밋 μ ˆμ°¨κ°€ 였래 κ±Έλ¦½λ‹ˆλ‹€. κ²Œμž„ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ„±λŠ₯κ³Ό 데이터 보호 강도 μ‚¬μ΄μ—μ„œ νŠΈλ ˆμ΄λ“œ μ˜€ν”„λ₯Ό μ„ νƒν•˜κ²Œ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

일반적으둜 κ²Œμž„μ—μ„œ 이 μ •λ„λ‘œ κ°•λ ₯ν•œ 보호 μˆ˜μ€€μ΄ μš”κ΅¬λ˜λŠ” κ²½μš°λŠ” λ“œλ¬Όλ‹€κ³  νŒλ‹¨ν•˜μ—¬ 아직 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  μžˆμŠ΅λ‹ˆλ‹€.