
| Dirty Read | Non-Repeatable Read | Phantom Read | 성능 | |
| READ UNCOMMITTED | 발생 가능 | 발생 가능 | 발생 가능 | 높음 |
| READ COMMITTED | 방지 | 발생 가능 | 발생 가능 | 보통 |
| REPEATABLE READ | 방지 | 방지 | 발생 가능 | 낮음 |
| SERIALIZABLE | 방지 | 방지 | 방지 | 가장 낮음 |
3.2.1 비관적 락 (Pessimistic Lock)
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT p FROM Product p WHERE p.id = :productId")
Optional<Product> findByIdWithLock(@Param("productId") Long productId);
@Transactional
public void reduceStock(Long productId) {
Product product = productRepository.findByIdWithLock(productId)
.orElseThrow(() -> new IllegalArgumentException("상품이 존재하지 않습니다."));
if (product.getStock() > 0) {
product.setStock(product.getStock() - 1);
productRepository.save(product);
} else {
throw new RuntimeException("재고가 부족합니다.");
}
}
3.2.2 낙관적 락 (Optimistic Lock)
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int stock;
@Version
private Long version; // 버전 관리
}
@Transactional
public void reduceStock(Long productId) {
Product product = productRepository.findById(productId)
.orElseThrow(() -> new IllegalArgumentException("상품이 존재하지 않습니다."));
product.setStock(product.getStock() - 1);
productRepository.save(product);
}
3.2.3 분산 락
3.2.4 기타 락
3.3.1 Timestamp Ordering (타임스탬프 오더링)
3.3.2 MVCC (Multi-Version Concurrency Control)
3.3.3 큐잉 시스템 (Queue-Based Systems)
public synchronized void updateStock() {
// 하나의 스레드만 접근 가능
stock--;
}
private final ReentrantLock lock = new ReentrantLock();
public void updateStock() {
lock.lock();
try {
stock--;
} finally {
lock.unlock();
}
}
| 헥사고날 아키텍처란 (0) | 2025.03.10 |
|---|---|
| TestSuiteExecutionException: Could not execute test class 해결방법 (0) | 2024.12.12 |
| Bean 수동 등록, Bean 주입 우선순위 - @Qualifier와 @Primary (0) | 2024.12.10 |
| ✍🏻IoC(제어의 역전), DI(의존성 주입) (0) | 2024.12.04 |
| Spring Bean (0) | 2024.12.01 |