동시성 제어
란 동시에 실행되는 여러 개의 트랜잭션
이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 순서를 제어하는 기법이다. 동시성 제어의 목적은 트랜잭션의 직렬성
을 보장하고 데이터의 무결성
및 일관성
을 보장하기 위함이다.
갱신 손실(Lost Update)
public void 1번_트랜잭션() {
// PK 1번 상품을 조회
Products products = basketQueryRepository.findProductsById(1L);
// 해당 객체의 재고를 -1하는 메소드 실행
products.updateStock(1);
// 업데이트된 내용 저장하기
productRepository.save(products);
}
public void 2번_트랜잭션() {
// PK 1번 상품을 조회
Products products = basketQueryRepository.findProductsById(1L);
// 해당 객체의 재고를 -3하는 메소드 실행
products.updateStock(3);
// 업데이트된 내용 저장하기
productRepository.save(products);
}
현황파악오류(Dirty Read)
@Transactional
public int 1번_트랜잭션() {
//PK가 1, 2, 3인 제품을 읽어옴
Products products1 = basketQueryRepository.findProductsById(1L);
Products products2 = basketQueryRepository.findProductsById(2L);
Products products3 = basketQueryRepository.findProductsById(3L);
// 제품의 재고를 각각 -3하는 메소드 실행
Products1.updateStock(3);
Products2.updateStock(3);
Products3.updateStock(3);
// 트랜잭션 커밋 시점에 JPA 더티 체킹으로 업데이트 쿼리 발생
}
public int 2번 트랜잭션() {
//PK가 1, 2, 3인 제품을 읽어옴
int productsStock1 = basketQueryRepository.findProductsById(1L).getStock();
int productsStock2 = basketQueryRepository.findProductsById(2L).getStock();
int productsStock3 = basketQueryRepository.findProductsById(3L).getStock();
// 제품의 재고를 각각 더해서 리턴
int stock = products1 + products2 + products3
return stock;
}
모순성(Inconsistency)
내 코드보다 사진이 나은 것 같아서 사진으로 대체한다. 근데 마지막 계산이 잘못됐다. Y에 100을 더해서 1100이다.
연쇄복귀(Cascading Rollback)