Spring Data Lock表在写入时读取

时间:2018-10-15 17:02:11

标签: spring hibernate jpa locking

我在我的应用程序(2.0.1)中使用Spring数据。该应用程序是基于REST的服务,可以添加订单。

订单实体如下:

@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;

过帐或订单在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();
    }

而findDailyNumberByDate是通过以下方式实现的:

@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();
    }

现在我有一个问题,它每天重复一次。当我要写入表格时,该表格未锁定以供读取。 我该如何实现?

我尝试锁定表-@Lock(LockModeType.PESSIMISTIC_WRITE) 或query.setLockMode(LockModeType.PESSIMISTIC_FORCE_INCREMENT); 但仍然无法正常工作。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

LockModeType可以在不同的数据库中以不同的方式工作,尤其是在Oracle数据库中,这会有些棘手。这里jpa lockmode type npt working as expected

回答了类似的问题