λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개인 곡뢀/DB

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

by syLim___ 2025. 1. 30.
728x90

 

πŸ“‘ 이전 κΈ€: [Jdbc] 컀λ„₯μ…˜ 풀링과 DataSource μΈν„°νŽ˜μ΄μŠ€

 

βœ… νŠΈλžœμž­μ…˜ κ°œλ…

λ°μ΄ν„°λ² μ΄μŠ€λŠ” νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•œλ‹€.

파일 μ‹œμŠ€ν…œ λŒ€μ‹  λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ 큰 이유 쀑 ν•˜λ‚˜μ΄κΈ°λ„ ν•˜λ‹€.

 

νŠΈλžœμž­μ…˜μ΄λž€, ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜λ„λ‘ 보μž₯ν•΄μ£ΌλŠ” 것이닀.

νŠΈλžœμž­μ…˜μ—μ„œ λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅ν•΄μ„œ DB에 정상 λ°˜μ˜λ˜λŠ” 것을 Commit이라고 ν•œλ‹€.

νŠΈλžœμž­μ…˜μ—μ„œ μž‘μ—… 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•΄μ„œ νŠΈλžœμž­μ…˜ μ‹œμž‘ μ „ μƒνƒœλ‘œ λ˜λŒλ¦¬λŠ” 것을 Rollback이라고 ν•œλ‹€.

 

πŸ“Œ νŠΈλžœμž­μ…˜ ACID

- νŠΈλžœμž­μ…˜μ€ μ›μžμ„±(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 λͺ¨λ‘ 보μž₯ν•΄μ•Ό ν•œλ‹€.

 

πŸ₯ μ›μžμ„± (Atomicity)

- νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ‹€ν–‰ν•œ μž‘μ—…λ“€μ€ 마치 ν•˜λ‚˜μ˜ μž‘μ—…μΈ κ²ƒμ²˜λŸΌ λͺ¨λ‘ μ„±κ³΅ν•˜κ±°λ‚˜, λͺ¨λ‘ μ‹€νŒ¨ν•΄μ•Ό ν•œλ‹€.

 

πŸ₯ 일관성 (Consistency)

- λͺ¨λ“  νŠΈλžœμž­μ…˜μ€ 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€.

- 예λ₯Ό λ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ •ν•œ 무결성 μ œμ•½ 쑰건을 항상 λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

 

πŸ₯ 격리성 (Ioslation)

- λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” μ„œλ‘œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜λ“€μ΄ μ„œλ‘œμ—κ²Œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ 격리해야 ν•œλ‹€.

- 격리성은 λ™μ‹œμ„±κ³Ό κ΄€λ ¨λœ μ„±λŠ₯ 이슈(νŠΈλžœμž­μ…˜ κ°„ 격리성을 μ™„λ²½νžˆ 보μž₯ν•˜λ €κ³  ν•˜λ©΄ λ™μ‹œ 처리 μ„±λŠ₯이 λ‚˜λΉ μ§)λ₯Ό λ°œμƒμ‹œν‚€κΈ° λ•Œλ¬Έμ—,

  νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ„ μ„ νƒν•˜μ—¬ μ„€μ •ν•  수 μžˆλ‹€.

πŸ“Œ νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€ (Isolation level)
- READ UNCOMMITED (μ»€λ°‹λ˜μ§€ μ•Šμ€ 읽기)
- READ COMMITED (μ»€λ°‹λœ 읽기)
- REPEATABLE READ (반볡 κ°€λŠ₯ν•œ 읽기)
- SERIALIZABLE (직렬화 κ°€λŠ₯)

 

πŸ₯ 지속성 (Durability)

- νŠΈλžœμž­μ…˜ 도쀑 μž₯μ• κ°€ λ°œμƒν•˜λ”λΌλ„ κ·Έ κ²°κ³Όκ°€ 항상 μ§€μ†λ˜μ–΄μ•Ό ν•œλ‹€.

- νŠΈλžœμž­μ…˜ 도쀑 μ‹œμŠ€ν…œμ— λ¬Έμ œκ°€ 생기더라도 λ°μ΄ν„°λ² μ΄μŠ€ 둜그 등을 ν™•μΈν•΄μ„œ νŠΈλžœμž­μ…˜ 성곡 λ‚΄μš©μ„ 볡ꡬ해야 ν•œλ‹€.

  (λΆ€λΆ„μ μœΌλ‘œ μˆ˜ν–‰λ˜μ—ˆλ‹€λ©΄ λ‘€λ°±)

- μ‰½κ²Œ λ§ν•˜λ©΄, μ •μƒμ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆκ±°λ‚˜ λΆ€λΆ„μ™„λ£Œλœ λ°μ΄ν„°λŠ” DBMSκ°€ μ±…μž„μ§€κ³  λ°μ΄ν„°λ² μ΄μŠ€μ— 기둝해야 ν•œλ‹€.

 

 

βœ… νŠΈλžœμž­μ…˜ μ‹€μŠ΅ (눈으둜 확인)

 

λ°μ΄ν„°λ² μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ 컀λ„₯μ…˜λ‹Ή ν•˜λ‚˜μ˜ DBμ„Έμ…˜μ΄ 생긴닀.

νŠΈλžœμž­μ…˜ 도쀑 λ³€κ²½λœ λ°μ΄ν„°λŠ” DBμ„Έμ…˜μ— μž„μ‹œμ €μž₯되고, νŠΈλžœμž­μ…˜μ΄ λλ‚˜λ©΄ 컀밋 λ˜λŠ” λ‘€λ°±λœλ‹€.

μ»€λ°‹λ˜κΈ° μ „ DB μ„Έμ…˜μ— μž„μ‹œ μ €μž₯된 λ°μ΄ν„°λŠ” λ‹€λ₯Έ DBμ„Έμ…˜μ—μ„œλŠ” 확인할 수 μ—†λ‹€.

 

눈으둜 확인해보기 μœ„ν•΄μ„œ 둜컬 h2 databaseλ₯Ό μ‹€ν–‰μ‹œν‚€κ³ ,

두 개의 db ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ ‘μ†ν•΄λ³΄μ•˜λ‹€. (JSESSIONIDκ°€ μ„œλ‘œ λ‹€λ₯΄λ‹€)

 

μ™Όμͺ½μ„ μ„Έμ…˜1, 였λ₯Έμͺ½μ„ μ„Έμ…˜2라고 ν•˜κ² λ‹€.

ν…Œμ΄λΈ”μ€ 미리 μƒμ„±ν•΄λ‘μ—ˆλ‹€.

 

πŸ“Œ μˆ˜λ™ 컀밋 λͺ¨λ“œ μ„€μ •ν•˜κΈ°

 

κΈ°λ³Έμ μœΌλ‘œλŠ” μžλ™ 컀밋 λͺ¨λ“œλ‘œ μ„€μ •λ˜μ–΄ 있기 λ•Œλ¬Έμ—

쿼리 ν•˜λ‚˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ μžλ™μœΌλ‘œ commit; λͺ…령어도 ν•¨κ»˜ μ‹€ν–‰λœλ‹€.

 

λ”°λΌμ„œ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ—μ„œ μ—¬λŸ¬ 개의 쿼리λ₯Ό μ²˜λ¦¬ν•˜λ €λ©΄ μˆ˜λ™ 컀밋 λͺ¨λ“œλ‘œ μ„€μ •ν•΄μ•Όν•œλ‹€.

set autocommit true; // μžλ™ 컀밋 λͺ¨λ“œ μ„€μ •
set autocommit false; // μˆ˜λ™ 컀밋 λͺ¨λ“œ μ„€μ •

 

 

πŸ“Œ 컀밋 μ „ μž„μ‹œ λ°μ΄ν„°λŠ” λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ 확인할 수 μ—†λ‹€!

 

μ„Έμ…˜1μ—μ„œ insert문을 μ‹€ν–‰ν•œ λ’€, μ„Έμ…˜1μ—μ„œ select해보면 μƒˆλ‘œ μΆ”κ°€ν•œ 멀버λ₯Ό 확인할 수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ„Έμ…˜2μ—μ„œλŠ” μ„Έμ…˜1에 μž„μ‹œμ €μž₯된 데이터λ₯Ό 확인할 수 μ—†λ‹€.

 

πŸ“Œ 컀밋을 ν•˜λ©΄, λ‹€λ₯Έ DBμ„Έμ…˜μ—μ„œ 보인닀!

μ„Έμ…˜1μ—μ„œ 컀밋을 ν–ˆλ”λ‹ˆ, μ„Έμ…˜2μ—μ„œλ„ ν•΄λ‹Ή 데이터λ₯Ό λ³Ό 수 μžˆλ‹€.

 

 

πŸ“Œ μ΄λ²ˆμ—λŠ” μ„Έμ…˜2μ—μ„œ 멀버 정보λ₯Ό μˆ˜μ •ν•΄λ³΄μ•˜λ‹€.

(autocommit 섀정은 DBμ„Έμ…˜λ§ˆλ‹€ λ”°λ‘œ μ„€μ •λ˜λŠ” 것 κ°™λ‹€.

κ·Έλž˜μ„œ μ„Έμ…˜2μ—μ„œλ„ autocommit 속성을 false둜 μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” 것을 ν™•μΈν–ˆλ‹€)

μ„Έμ…˜1μ—μ„œλŠ” μ„Έμ…˜2에 μž„μ‹œ μ €μž₯된 데이터λ₯Ό 확인할 수 μ—†λ‹€.

 

πŸ“Œ μ„Έμ…˜2μ—μ„œ 둀백을 ν•˜λ©΄, 변경사항이 μ›μƒλ³΅κ΅¬λœλ‹€.

λ‹Ήμ—°νžˆ μ„Έμ…˜1μ—μ„œλ„ μ›μƒλ³΅κ΅¬λœ 데이터λ₯Ό 읽을 수 μžˆλ‹€.

 

βœ… λ°μ΄ν„°λ² μ΄μŠ€ Lock

μ„Έμ…˜1μ—μ„œ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³  데이터λ₯Ό μˆ˜μ •ν•˜λŠ” λ™μ•ˆ

μ„Έμ…˜2μ—μ„œλ„ 같은 데이터λ₯Ό μˆ˜μ •ν•˜κ²Œ 되면,

νŠΈλžœμž­μ…˜μ˜ μ›μžμ„±μ΄ κΉ¨μ§€λŠ” λ¬Έμ œκ°€ λ°œμƒν•  것이닀.

 

λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Lock μ΄λΌλŠ” κ°œλ…μ„ μ œκ³΅ν•œλ‹€.

 

νŠΉμ • μ„Έμ…˜μ—μ„œ νŠΉμ • 데이터(row)λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” 락을 νšλ“ν•΄μ•Όν•œλ‹€.

λ™μ‹œμ— λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ λ™μΌν•œ 데이터λ₯Ό μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄ 락을 νšλ“ν•˜μ§€ λͺ»ν•΄ λŒ€κΈ°ν•˜κ²Œ λœλ‹€.

락을 κ°€μ§€κ³  μžˆλŠ” μ„Έμ…˜μ΄ commit λ˜λŠ” rollback을 ν•˜κ²Œ 되면 락을 λ°˜λ‚©ν•˜κ³ , λ‹€λ₯Έ μ„Έμ…˜μ΄ 락을 νšλ“ν•  수 있게 λœλ‹€.

 

πŸ“Œ 눈으둜 확인해보기

μš°μ„  μ‹€μŠ΅μ„ μœ„ν•΄ ν…Œμ΄λΈ”μ— 2개의 데이터λ₯Ό μΆ”κ°€ν•˜μ˜€λ‹€.

μ„Έμ…˜1μ—μ„œ 멀버 asdf의 λˆμ„ 100으둜 λ³€κ²½ν•˜μ˜€λ‹€. μ΄λ•Œ μ„Έμ…˜1은 pkκ°€ asdf인 데이터에 λŒ€ν•΄ 락을 νšλ“ν•˜κ²Œ λœλ‹€.

λ™μ‹œμ— μ„Έμ…˜2μ—μ„œ 멀버 qwerκ³Ό 멀버 asdf의 λˆμ„ 0으둜 λ³€κ²½ν•˜λ €κ³  μ‹œλ„ν•œλ‹€.

μ„Έμ…˜2λŠ” 멀버 qwer에 λŒ€ν•΄μ„œλŠ” 락을 νšλ“ν•˜μ—¬ 멀버 qwer 데이터λ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ 멀버 asdf의 경우 μ„Έμ…˜1이 락을 κ°€μ§€κ³  있기 λ•Œλ¬Έμ— μ„Έμ…˜2μ—μ„œ 락 νšλ“μ— μ‹€νŒ¨ν•˜κ³ , 락을 νšλ“ν•  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜κ²Œ λœλ‹€.

 

λ‚˜κ°™μ€ 경우 set lock_timeout 100; λͺ…λ Ήμ–΄λ₯Ό 톡해 lock νšλ“μ„ μœ„ν•΄ 100millis만큼만 λŒ€κΈ°ν•˜κ³ , νƒ€μž„μ•„μ›ƒμ΄ λ°œμƒν•˜λ©΄ 쿼리 싀행을 μ·¨μ†Œν•˜λ„λ‘ μ„€μ •ν•΄λ‘μ—ˆλ‹€.

 

πŸ“Œ μ„Έμ…˜1μ—μ„œ 컀밋을 ν•˜λ©΄ 락을 λ°˜λ‚©ν•œλ‹€.

 

μ„Έμ…˜2μ—μ„œ λ‹€μ‹œ 멀버 asdf 데이터λ₯Ό λ³€κ²½μ‹œλ„ν•˜λ©΄,

락 νšλ“μ— μ„±κ³΅ν•˜μ—¬ 변경도 μ„±κ³΅ν•˜κ²Œ λœλ‹€.

 

 

참고둜, select for update ꡬ문을 μ‚¬μš©ν•˜λ©΄

νŠΉμ • μ„Έμ…˜μ—μ„œ selectν•˜λŠ” λ™μ•ˆμ—λ„ ν•΄λ‹Ή 데이터에 λŒ€ν•œ 락을 νšλ“ν•˜κ²Œ λœλ‹€.

λ”°λΌμ„œ 락을 νšλ“ν•œ μ„Έμ…˜μ˜ νŠΈλžœμž­μ…˜μ΄ λλ‚˜μ§€ μ•Šμ€ λ™μ•ˆμ—λŠ”

λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ ν•΄λ‹Ή 데이터λ₯Ό μˆ˜μ •ν•  수 μ—†κ²Œ λœλ‹€.

 

 

πŸ“‘ λ‹€μŒ κΈ€ :[jdbc] νŠΈλžœμž­μ…˜ 관리 (feat. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬)

728x90