Hej,
Mam wystawiony endpoint, który przyjmuje jakieś dane, i jeśli znajdzie w bazie pasujący rekord to robi update, w innym przypadku zapisuje nowy rekord. ( nie po id, tylko po innym zwykłym polu )
Czyli mniej więcej logika pseudokodu wygląda tak:
@Transactional
public void saveOrUpdateOrder(OrderDto dto) {
orderRepository.findByNumber(dto.getSomeNumber).ifPresentOrElse(
order -> updateOrder(order, dto),
() -> createNewOrder(dto))
);
}
private void updateOrder(Order order, OrderDto dto) {
order.setSomething(dto.getSomething);
order.setSomethingElse(dto.getSomethingElse());
orderRepository.saveAndFlush(order);
}
private void createOrder(OrderDto dto) {
Order newOrder = new Order(dto.getSomething(), dto.getSomethingElse());
orderRepository.saveAndFlush(newOrder);
}
No ale teraz problem jest taki, że mogę dostać w bardzo krótkim czasie dużo requestów (różnice milisekundowe). I wtedy działa to tak, że do bazy zostaje zapisanych pare rekordów o tym samym 'someNumber', aż w pewnym momencie zaczyna lecieć błąd, że query did not return a unique result( powinien zapisać się pierwszy rekord, a następne robić na nim update )
Macie jakiś pomysł, jak wstrzymać kolejne requesty, tak, żeby najpierw został zapisany w bazie rekord, a później kolejne już robiły update?