diff --git a/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java b/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java index 92ba34a8..fe507c3f 100644 --- a/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java +++ b/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java @@ -1,14 +1,23 @@ package com.petshop.backend.repository; import com.petshop.backend.entity.Refund; +import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface RefundRepository extends JpaRepository { List findByCustomerIdOrderByCreatedAtDesc(Long customerId); List findAllByOrderByCreatedAtDesc(); List findBySaleId(Long saleId); + + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("SELECT r FROM Refund r WHERE r.id = :id") + Optional findByIdForUpdate(@Param("id") Long id); } diff --git a/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java b/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java index 4313ba51..19a93ee9 100644 --- a/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java +++ b/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java @@ -1,10 +1,12 @@ package com.petshop.backend.repository; import com.petshop.backend.entity.Sale; +import jakarta.persistence.LockModeType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import java.time.LocalDateTime; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -42,5 +44,9 @@ public interface SaleRepository extends JpaRepository { List findByOriginalSaleSaleId(Long originalSaleId); + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("SELECT s FROM Sale s WHERE s.saleId = :id") + Optional findByIdForUpdate(@Param("id") Long id); + Optional findByCartCartId(Long cartId); } diff --git a/backend/src/main/java/com/petshop/backend/service/RefundService.java b/backend/src/main/java/com/petshop/backend/service/RefundService.java index 961efb24..6cfff23d 100644 --- a/backend/src/main/java/com/petshop/backend/service/RefundService.java +++ b/backend/src/main/java/com/petshop/backend/service/RefundService.java @@ -112,7 +112,7 @@ public class RefundService { @Transactional public RefundResponse updateRefundStatus(Long id, String status) { - Refund refund = refundRepository.findById(id) + Refund refund = refundRepository.findByIdForUpdate(id) .orElseThrow(() -> new ResourceNotFoundException("Refund not found")); Refund.RefundStatus newStatus; diff --git a/backend/src/main/java/com/petshop/backend/service/SaleService.java b/backend/src/main/java/com/petshop/backend/service/SaleService.java index b53a4c4c..37d4e338 100644 --- a/backend/src/main/java/com/petshop/backend/service/SaleService.java +++ b/backend/src/main/java/com/petshop/backend/service/SaleService.java @@ -107,7 +107,7 @@ public class SaleService { } if (sale.getIsRefund() && request.getOriginalSaleId() != null) { - Sale originalSale = saleRepository.findById(request.getOriginalSaleId()) + Sale originalSale = saleRepository.findByIdForUpdate(request.getOriginalSaleId()) .orElseThrow(() -> new ResourceNotFoundException("Original sale not found with id: " + request.getOriginalSaleId())); sale.setOriginalSale(originalSale); }