Dev-Kyuu
article thumbnail

λŒ€λŸ‰μ˜ νŠΈλž˜ν”½μ„ ν•Έλ“€λ§ν•˜κΈ° μœ„ν•œ λ™μ‹œμ„± μ œμ–΄ 기법 쀑 μ—¬λŸ¬κ°€μ§€ 방법이 μžˆλŠ”λ°

κ·Έμ€‘μ—μ„œ 비관적 락과, 낙관적 락 두 락의 차이λ₯Ό μ•Œμ•„λ³΄μž πŸ‘€

 


비관적락

: μžμ› μš”μ²­μ— λ”°λΌμ„œ λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν• κ²ƒμ΄λΌκ³  사전에 μ˜ˆμΈ‘ν•˜κ³ , 락을 κ±Έμ–΄λ²„λ¦¬λŠ” 방법둠

: νŠΈλžœμž­μ…˜μ˜ 좩돌이 λ°œμƒν•œλ‹€κ³  κ°€μ •ν•˜κ³  ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μžμ›μ— μ ‘κ·Όμ‹œ 락을 κ±Έκ³ , λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 함 

: λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ Shared Lock(곡유, 읽기 잠금), Exclusive Lock(배타, μ“°κΈ° 잠금)을 건닀.

 

1. Shared Lock

- μ ‘κ·Όν•œ νŠΈλžœμž­μ…˜μ΄ μž‘μ—…μ€‘μΌ λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œλŠ” 읽기만 κ°€λŠ₯ν•˜κ³ , Exclusive Lock 적용이 λΆˆκ°€λŠ₯ν•˜λ‹€. 

 

 

2. Exclusive Lock

- μ ‘κ·Όν•œ νŠΈλžœμž­μ…˜μ΄ μž‘μ—…μ€‘μΌ λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œλŠ” 읽기/μ“°κΈ°κ°€ λͺ¨λ‘ λΆˆκ°€λŠ₯ν•˜κ³  Shared/Exclusive Lock 적용이 μΆ”κ°€μ μœΌλ‘œ λΆˆκ°€λŠ₯

public interface BoardRepository extends JpaRepository<Board, Long> {

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("select b from Board b where b.id = :id")
    Board findByIdForUpdate(Long id);
}

*/ LockMode μ’…λ₯˜ 

LockModeType.PESSIMISTIC_WRITE
- 일반적인 μ˜΅μ…˜. λ°μ΄ν„°λ² μ΄μŠ€μ— μ“°κΈ° 락
- λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ 읽기도 쓰기도 λͺ»ν•¨. (Exclusive lock)

LockModeType.PESSIMISTIC_READ
반볡 μ½κΈ°λ§Œν•˜κ³  μˆ˜μ •ν•˜μ§€ μ•ŠλŠ” μš©λ„λ‘œ 락을 κ±Έ λ•Œ μ‚¬μš©
λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ½κΈ°λŠ” κ°€λŠ₯함. (Shared Lock)

LockModeType.PESSINISTIC_FORCE_INCREMENT
Version 정보λ₯Ό μ‚¬μš©ν•˜λŠ” 비관적 락

 

3. μž₯점과 단점

 

: 비관적 락 μžμ²΄λŠ” 둜우 μžμ²΄μ— 락을 μ‹€μ œλ‘œ μ„€μ •ν•¨μœΌλ‘œ μ„±λŠ₯상 λ¬Έμ œκ°€ λ°œμƒν•  수 있음

: 좩돌이 자주 λ°œμƒν•˜λŠ” ν™˜κ²½μ—μ„œ 둀백의 횟수λ₯Ό 쀄일 수 있고, 데이터 무결성을 보μž₯ν•˜λŠ” μˆ˜μ€€μ΄ 맀우 λ†’μŒ!

 


낙관적락

: μžμ›μ— 락을 κ±Έμ–΄μ„œ μ„ μ ν•˜λŠ” 방식이 μ•„λ‹Œ, λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ κ·Έλ•Œ μ²˜λ¦¬ν•˜μž! λŠ” 낙관적 처리 기법

: νŠΈλžœμž­μ…˜μ΄ 좩돌이 λ°œμƒν•˜μ§€ μ•Šμ„κ²ƒμ΄λΌλŠ” 가정을 ν•˜μ—¬ μΆ©λŒμ„ λ§‰μ§€μ•Šκ³  좩돌이 λ‚œκ²ƒμ„ κ°μ§€ν•˜λ©΄ κ·Έλ•Œ 처리

: λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ œκ³΅ν•˜λŠ” 락 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€μ•Šκ³ (DBλ‹¨μ—μ„œ λ™μ‹œμ„± 처리X) JPAκ°€ μ œκ³΅ν•˜λŠ” 버전 관리 κΈ°λŠ₯을 μ‚¬μš©ν•¨ 

   => version의 μƒνƒœλ₯Ό 보고 μΆ©λŒμ„ ν™•μΈν•˜λ©° 좩돌이 ν™•μΈλœ 경우 Rollback ν•˜λŠ” λ°©μ‹μœΌλ‘œ 처리

 

 

@Entity
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version						// μ—”ν‹°ν‹°λ₯Ό μˆ˜μ •ν•  λ•Œ λ§ˆλ‹€ 버전이 증가함
    private Long version;
}

1. μž₯점과 단점

 

: 좩돌이 λ‚˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ°€μ •ν•˜μ— λ™μ‹œ μš”μ²­μ— λŒ€ν•΄ 처리 μ„±λŠ₯이 μ’‹μŒ

: μž¦μ€ 좩돌이 μΌμ–΄λ‚˜λŠ” 경우 λ‘€λ°± μ²˜λ¦¬μ— λŒ€ν•œ λΉ„μš©(μš”μ²­μ΄ μ‹€νŒ¨ν•  경우 κ°œλ°œμžκ°€ 직접 둀백처리λ₯Ό 해야함)이 많이 λ“€μ–΄ 손해가 λ°œμƒν•¨

: νŠΈλžœμž­μ…˜μ„ μ»€λ°‹ν•˜κΈ°μ „μ—λŠ” 좩돌 μ—¬λΆ€λ₯Ό μ•Œ 수 μ—†μŒ 

 

 

 

'πŸ“ JPA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

λ™μ‹œμ„± μ œμ–΄ Chap 2 | 뢄산락  (0) 2023.01.24
JPA | JPA With Native Query  (0) 2022.12.14
JPA | 연관관계  (0) 2022.12.08
profile

Dev-Kyuu

@kyuu_ng

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!