*[λ°μ΄ν„°λ² μ΄μŠ€] νŠΈλžœμž­μ…˜

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

νŠΈλžœμž­μ…˜μ΄λž€? 

λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”(SQL μ§ˆμ˜μ–΄ μ‚¬μš©)μ‹œν‚€κΈ° μœ„ν•΄ μˆ˜ν–‰ν•˜λŠ” μž‘μ—… λ‹¨μœ„ 
μž‘μ—… λ‹¨μœ„λŠ” SQL λͺ…λ Ήλ¬Έλ“€λ‘œ 이루어져 있으며 κ°œλ°œμžκ°€ μ •ν•˜λŠ” 기쀀에 따라 닀름

 

μ˜ˆμ‹œ) νšŒμ› 정보 μˆ˜μ • 

  1. μ €μž₯ λ²„νŠΌ 클릭 : UPDATE문을 μ΄μš©ν•˜μ—¬ μ‚¬μš©μž 정보 μˆ˜μ •
  2. νšŒμ› 정보 ꡬ성 : SELECT문을 μ΄μš©ν•˜μ—¬ μ‚¬μš©μž 정보 μ΅œμ‹  μœ μ§€
  3. μž‘μ—… λ‹¨μœ„ : UPDATE + SELECT   

νŠΈλžœμž­μ…˜ νŠΉμ§•

  1. μ›μžμ„± : DB에 λͺ¨λ‘ λ°˜μ˜λ˜κ±°λ‚˜, μ•„μ˜ˆ λ°˜μ˜λ˜μ§€ μ•Šκ±°λ‚˜ 
  2. 일관성 : μž‘μ—… 처리 κ²°κ³ΌλŠ” 늘 같아야함 
  3. 독립성 : νŠΈλžœμž­μ…˜μ˜ 연산에 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 끼어듀 수 μ—†μŒ 
  4. 지속성 : νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆλ‹€λ©΄, κ·Έ κ²°κ³ΌλŠ” μ˜κ΅¬μ μ΄μ—¬μ•Όν•¨ 

Commitκ³Ό Rollback 

  1. Commit : ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜μ—ˆμœΌλ©°, DBκ°€ μΌκ΄€μ„±μžˆλŠ” μƒνƒœμΌ λ•Œ μ•Œλ €μ£ΌκΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ—°μ‚° 
  2. Rollback : ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ–΄ μ›μžμ„±μ΄ μΉ¨ν•΄λœ 경우, νŠΈλžœμž­μ…˜ μ‹œμž‘μ „ μƒνƒœλ‘œ rollback κ°€λŠ₯ 

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

DBMS의 ꡬ쑰 

  1. Query Processor(질의 처리기), Storage System(μ €μž₯ μ‹œμŠ€ν…œ), Page Buffer 
  2. μž…μΆœλ ₯ λ‹¨μœ„ : κ³ μ • 길이의 page λ‹¨μœ„λ‘œ disk에 μ½κ±°λ‚˜ 씀 
  3. μ €μž₯ 곡간 : λΉ„νœ˜λ°œμ„± μ €μž₯ μž₯치 disk에 μ €μž₯ν•˜κ³ , 일뢀λ₯Ό Main Memory에 μ €μž₯ 

Page Buffer Manager

  1. DBMS의 μ €μž₯ μ‹œμŠ€ν…œμ— μ†ν•˜λŠ” λͺ¨λ“ˆ 쀑 ν•˜λ‚˜λ‘œ, Main Memory에 μœ μ§€ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό 관리 
  2. Buffer의 관리 정책에 따라 UNDO 볡ꡬ, REDO 볡ꡬ의 ν•„μš”μ„±μ΄ 결정됨 

UNDO 

  1. Buffer ꡐ체 μ•Œκ³ λ¦¬μ¦˜μ— 따라 Buffer의 κ΅μ²΄λŠ” Buffer의 μƒνƒœμ— 따라 κ²°μ •λ˜λ―€λ‘œ(νŠΈλžœμž­μ…˜μ˜ μƒνƒœX) νŠΈλžœμž­μ…˜κ°„ λ³€κ²½λœ page듀이 λ””μŠ€ν¬μ— 좜λ ₯될 수 있음
  2. λ§Œμ•½ νŠΈλžœμž­μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ””μŠ€ν¬μ— μž…λ ₯된 pageλ₯Ό 원상 볡ꡬ μ‹œμΌœμ•Όν•¨ (UNDO)

UNDOκ°€ 영ν–₯을 λ°›λŠ” 버퍼 관리 μ •μ±… 

  1. 첫번째 정책은 μˆ˜μ •λœ νŽ˜μ΄μ§€λ₯Ό μ–Έμ œλ“ μ§€ λ””μŠ€ν¬μ— μž‘μ„±ν•  수 μžˆλŠ” 정책이닀. λŒ€λΆ€λΆ„μ˜ DBMSκ°€ μ±„νƒν•˜λŠ” Buffer 관리 정책이며, UNDO loggingκ³Ό 볡ꡬ가 ν•„μš”ν•˜λ‹€.
  2. λ‘λ²ˆμ§Έ 정책은 νŠΈλžœμž­μ…˜ μ’…λ£Œ μ‹œμ κΉŒμ§€λŠ” 버퍼에 μœ μ§€ν•˜λŠ” 정책이닀. UNDOλŠ” ν•„μš”μ—†μ§€λ§Œ, 맀우 큰 λ©”λͺ¨λ¦¬ 버퍼가 ν•„μš”ν•˜λ‹€.

REDO 

  1. 이미 commitν•œ νŠΈλžœμž­μ…˜μ˜ μˆ˜μ •μ„ λ””μŠ€ν¬μ— λ°˜μ˜ν•˜λŠ” 볡ꡬ μž‘μ—…

REDOκ°€ 영ν–₯을 λ°›λŠ” 버퍼 관리 μ •μ±…

  1. μˆ˜μ •ν–ˆλ˜ λͺ¨λ“  νŽ˜μ΄μ§€λ₯Ό νŠΈλžœμž­μ…˜ 컀밋 μ‹œμ μ— λ””μŠ€ν¬μ— λ°˜μ˜ν•˜λŠ” μ •μ±…, νŠΈλžœμž­μ…˜μ΄ μ»€λ°‹λ˜μ—ˆμ„ λ•Œ μˆ˜μ •λœ νŽ˜μ΄μ§€λ“€μ΄ disk에 λ°˜μ˜λ˜λ―€λ‘œ redoκ°€ ν•„μš” μ—†λ‹€.
  2. μˆ˜μ •ν–ˆλ˜ νŽ˜μ΄μ§€λ₯Ό νŠΈλžœμž­μ…˜ 컀밋 μ‹œμ μ— λ””μŠ€ν¬μ— λ°˜μ˜ν•˜μ§€ μ•ŠλŠ” μ •μ±…, νŠΈλžœμž­μ…˜μ΄ λ””μŠ€ν¬μƒμ˜ db에 λ°˜μ˜λ˜μ§€ μ•Šμ„ 수 μžˆκΈ°μ— redo ν•„μš”ν•˜λ©° λŒ€λΆ€λΆ„μ˜ DBMS 정책이닀.

νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€

νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ΄λž€? 

νŠΈλžœμž­μ…˜ κ²©λ¦¬μˆ˜μ€€μ΄λž€ λ™μ‹œμ— μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ  λ•Œ, νŠΈλžœμž­μ…˜λΌλ¦¬ μ–Όλ§ˆλ‚˜ κ³ λ¦½λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것을 λ§ν•œλ‹€. 
μ‹€μ œλ‘œ ACID 원칙은 μ’…μ’… μ§€μΌœμ§€μ§€ μ•ŠλŠ”λ‹€, DB엔진은 λ™μ‹œμ„±μ„ μœ„ν•΄μ„œ ACID 원칙을 ν¬μƒν•˜μ—¬ λ™μ‹œμ„±μ„ 얻을 수 μžˆλŠ” isolation level(격리 μˆ˜μ€€)을 μ œκ³΅ν•œλ‹€.

InnoDB의 격리 μˆ˜μ€€ μ’…λ₯˜ 

  1. READ UNCOMMITED : μ–΄λ–€ νŠΈλžœμž­μ…˜μ΄ νŠΉμ • ν…Œμ΄λΈ”μ„ 작고 μžˆλ”λΌλ„ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ‘°νšŒκ°€ κ°€λŠ₯ν•˜λ‹€. 
  2. READ COMMITED : μ–΄λ–€ νŠΈλžœμž­μ…˜μ˜ μž‘μ—…μ΄ μ™„λ£Œλœ ν›„ COMMIT이 λ˜μ–΄μ•Όλ§Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ‘°νšŒκ°€ κ°€λŠ₯ν•˜λ‹€.
  3. REPETABLE READ : λ°˜λ³΅ν•΄μ„œ 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ”λΌλ„ 읽어 λ“€μ΄λŠ” 값이 λ³€ν™”ν•˜μ§€ μ•ŠλŠ” μ •λ„μ˜ 격리 μˆ˜μ€€μ„ 보μž₯ν•œλ‹€.
  4. SERIALIZABLE : μ“°κΈ° μž‘μ—… 뿐만 μ•„λ‹ˆλΌ 읽기 μž‘μ—…μ—λ„ LOCK을 μ„€μ •ν•˜λŠ” 격리 μˆ˜μ€€μ΄λ‹€. 

READ UNCOMMITED

아직 μ»€λ°‹λ˜μ§€ μ•Šμ€ 데이터도 μ½μ–΄μ˜¬ 수 μžˆλŠ” 격리 μˆ˜μ€€μ΄λ‹€. λŒ€μ‹  이 격리 μˆ˜μ€€μ„ μ‚¬μš©ν•œλ‹€λ©΄ DIRTY READκ°€ λ°œμƒν•  수 μžˆλ‹€. 

μ°Έκ³ ) DIRTY READ
둀백이 이루어져 μ‹€μ œλ‘œ 컀밋이 이루어지지 μ•Šμ€ 데이터λ₯Ό 읽어 λ“€μ΄λŠ” ν˜„μƒμ„ λ§ν•œλ‹€.

READ COMMITED

μ»€λ°‹λœ λ°μ΄ν„°λ§Œ λ³΄μ΄λŠ” μˆ˜μ€€μ˜ isolation을 보μž₯ν•˜λŠ” 격리 μˆ˜μ€€μ΄λ‹€.  REPEATBLE READκ°€ Transaction이 첫 읽기 μž‘μ—…μ„ κΈ°μ€€μœΌλ‘œ  Consistent Readλ₯Ό μˆ˜ν–‰ν•˜λŠ” 반면, READ COMMITEDλŠ” 읽기 μž‘μ—…λ§ˆλ‹€ DB snapshot을 λ‹€μ‹œ κ΅¬μ„±ν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 읽기 μž‘μ—…λ§ˆλ‹€ μ»€λ°‹λœ 데이터λ₯Ό μ½μ–΄μ˜¬ 수 μžˆλŠ” 것이닀. λŒ€μ‹  ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ—μ„œ 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν–ˆμ„ λ•Œ 늘 같은 κ²°κ³Όλ₯Ό 가져와야 ν•˜λŠ” 정합성에 μ–΄κΈ‹λ‚œλ‹€. (UNREPETABLE READ) 

REPETABLE READ 

λ°˜λ³΅ν•΄μ„œ 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ”λΌλ„ 값이 λ³€ν™”ν•˜μ§€ μ•ŠλŠ” isolation을 보μž₯ν•˜λŠ” 격리 μˆ˜μ€€μ΄λ‹€. REPETABLE READλŠ” νŠΈλžœμž­μ…˜ μž‘μ—…μ—μ„œ 처음 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œμ˜ μ‹œκ°„μ„ κΈ°λ‘ν•œ ν›„ κ·Έ 이후 λͺ¨λ“  읽기 μž‘μ—…μ—μ„œ κ·Έ μ‹œκ°„λŒ€μ˜ Consistent Readλ₯Ό μˆ˜ν–‰ν•œλ‹€. λ”°λΌμ„œ νŠΈλžœμž­μ…˜ μž‘μ—… 쀑에 μ ‘κ·Όν•˜λŠ” ν…Œμ΄λΈ”μ— μƒˆλ‘œμš΄ 컀밋이 μ΄λ£¨μ–΄μ‘Œλ”λΌλ„ 첫 읽기 μž‘μ—… λ•Œ κ΅¬μ„±λœ snapshot을 μ½μ–΄μ˜€κΈ° 떄문에 κ°’μ˜ λ³€ν™”κ°€ μ—†λ‹€. λŒ€μ‹  이 격리 μˆ˜μ€€μ„ μ‚¬μš©ν•œλ‹€λ©΄ PHANTOM READκ°€ λ°œμƒν•  수 μžˆλ‹€.

μ°Έκ³ ) PHANTOM READ
Consistent Readκ°€ λ³€κ²½λœ 데이터에 ν•œν•΄μ„œλ§Œ Snapshot을 κ΅¬μ„±ν•˜λŠ”λ°, λ§Œμ•½ 데이터가 μΆ”κ°€λ˜λŠ” 경우 λ‹€μŒ 읽기 μž‘μ—…μ‹œμ— μƒμ„±ν•˜μ§€λ„ μ•Šμ•˜λ˜ 행이 μΆ”κ°€λ˜λŠ” ν˜„μƒμ„ νŒ¬ν…€ 읽기라고 ν•œλ‹€.

SERIALIZBLE

읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œλ„ 락을 건 후에 μˆ˜ν–‰ν•˜λŠ” 격리 μˆ˜μ€€μΈλ°, λ°λ“œλ½μ΄ λ°œμƒν•  ν™•λ₯ μ΄ ꡉμž₯히 λ†’λ‹€. 

μ°Έκ³ ) Consistent Read
읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ ν˜„μž¬ DB의 값이 μ•„λ‹Œ νŠΉμ • μ‹œμ μ˜ DB snapshot을 μ½μ–΄μ˜€λŠ” 것을 μ˜λ―Έν•œλ‹€. λ¬Όλ‘  이 snapshot은 μ»€λ°‹λœ λ³€ν™”λ§Œμ΄ 적용된 이미지이며 Inno DB 엔진은 logλ₯Ό 톡해 이λ₯Ό μ§€μ›ν•œλ‹€.

 

Reference

https://d2.naver.com/helloworld/407507

https://real-dongsoo7.tistory.com/57

 

λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜(Transaction)에 λŒ€ν•˜μ—¬ μ•Œμ•„λ³΄μž!

μ‹œμž‘ν•˜κΈ° 전에 ν•΄λ‹Ή λΈ”λ‘œκ·Έμ— μž‘μ„±λ˜λŠ” 글은 주인μž₯의 μ§€κ·Ήνžˆ 주관적인 생각이 λ‹€μˆ˜μ΄λ©°, λŒ€λΆ€λΆ„μ˜ 지식은 ꡬ글링을 톡해 μ–»κ³  있기 λ•Œλ¬Έμ— μ˜³μ§€μ•Šμ€ 정보가 μžˆμŠ΅λ‹ˆλ‹€. 잘λͺ»λœ λΆ€λΆ„μ΄λ‚˜ μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” 뢀뢄이 μžˆλ‹€..

real-dongsoo7.tistory.com

https://github.com/gyoogle/tech-interview-for-developer

 

gyoogle/tech-interview-for-developer

πŸ‘ΆπŸ» μ‹ μž… 개발자 전곡 지식 & 기술 λ©΄μ ‘ 백과사전 πŸ“–. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com