Spring Data Lock таблица для чтения во время записи - PullRequest
0 голосов
/ 15 октября 2018

Я использую данные Spring в своем приложении (2.0.1).Приложение представляет собой службу на основе 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();
    }

Теперь у меня проблема, что он дублируется dailyNumber.Таблица не заблокирована для чтения, когда я собираюсь написать в нее.Как мне этого добиться?

Я пытался заблокировать таблицу - @Lock (LockModeType.PESSIMISTIC_WRITE) или query.setLockMode (LockModeType.PESSIMISTIC_FORCE_INCREMENT);но все еще не работает.

Большое спасибо за помощь

1 Ответ

0 голосов
/ 15 октября 2018

LockModeType может работать по-разному с разными базами данных, особенно с Oracle db, это становится немного сложнее.На подобную проблему здесь ответили jpa lockmode type npt, работающий как ожидалось

...