Supposed I have two API:
one for get customer name and another for updates customer name
I have two request simultaneously for updates customer name, how to auto handle this concurrency and Don’t occur race condition?
Because I don’t see any real world example to use synchronized for this scenario.
Can you help me and explain?
package com.example.customerapp.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.example.customerapp.dao;
import com.example.customerapp.model.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CustomerRepository extends JpaRepository<Customer, Long> {
}
package com.example.customerapp.service;
import com.example.customerapp.dao.CustomerRepository;
import com.example.customerapp.model.Customer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class CustomerService {
@Autowired
private CustomerRepository customerRepository;
public Optional<Customer> getCustomerById(Long id) {
return customerRepository.findById(id);
}
public Customer saveOrUpdateCustomer(Customer customer) {
return customerRepository.save(customer);
}
}
package com.example.customerapp.controller;
import com.example.customerapp.model.Customer;
import com.example.customerapp.service.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@RestController
@RequestMapping("/customer")
public class CustomerController {
@Autowired
private CustomerService customerService;
@GetMapping("/{id}")
public ResponseEntity<Customer> getCustomer(@PathVariable Long id) {
Optional<Customer> customer = customerService.getCustomerById(id);
return customer.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PutMapping
public ResponseEntity<Customer> updateCustomer(@RequestBody Customer customer) {
Customer savedCustomer = customerService.saveOrUpdateCustomer(customer);
return ResponseEntity.ok(savedCustomer);
}
}
New contributor
James is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
4