kk2449
kk2449

Reputation: 87

Spring Data lock table to read while writing

I am using Spring data in my app (2.0.1). The app is REST-based service which add orders.

The order entity looks as follows:

@Entity
@Table(name = "orders")
@Data
@NoArgsConstructor
public class OrderEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Version
    private int version;

    private Date date;
    private String post;

    private BigDecimal totalAmount;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "order_id")
    List<OrderSetEntity> sets;


    private int dailyNumber;
    private String documentNumber;

The posting or orders happens in OrderService:

    public Long postOrder(OrderDTO orderDTO){

        Date date = new Date();
        OrderEntity order = new OrderEntity(date, orderDTO.getPost(), orderDTO.getPaymentMethod());
        Integer dailyNumber = orderRepository.findDailyNumberByDate(date) + 1;
        order.setDailyNumber(dailyNumber);
        orderRepository.save(order);

        return order.getId();
    }

while findDailyNumberByDate is implemented this way:

@Override
public int findDailyNumberByDate(Date date) {

    String sql = String.format("select max(o.dailyNumber) from OrderEntity o ");
    Query query = entityManager.createQuery(sql);

    Integer result = (Integer) query.getSingleResult();
    if (result == null){
        return 0;
    }else {
        return result.intValue();
    }

Now I have a problem, that it get duplicated dailyNumber. The table isn't locked for reading when I am about to write into it. How can I achieve it?

I tried lockin the table - @Lock(LockModeType.PESSIMISTIC_WRITE) or query.setLockMode(LockModeType.PESSIMISTIC_FORCE_INCREMENT); but is still isn't working.

Thanks a lot for help

Upvotes: 1

Views: 1901

Answers (1)

Khwaja Sanjari
Khwaja Sanjari

Reputation: 465

LockModeType can work in different ways with different databases, especially with Oracle db it gets a little tricky. A similar issue was answered here jpa lockmode type npt working as expected

Upvotes: 1

Related Questions