Hibernate PESSIMISTIC_WRITE не блокирует БД и возвращает oldValue - PullRequest
0 голосов
/ 09 февраля 2020

Я использую базу данных "Postgres" и pessimistic_locking для блокировки строки базы данных.

У меня есть следующий код

@Transactional
doProcess(int id, int quantity){
   Article article = lockArticle(id);
   modifyArticle(article, quantity);
}

Это функция lockArticle (), которая блокирует и выбирает статью из БД (Postgres)

Article lockArticle(int id){
        return sessionFactory.getCurrentSession().createCriteria(Article.class)
                .add(Restrictions.eq("id", id))
                .setLockMode(LockMode.PESSIMISTIC_WRITE)
                .setTimeout(10000)
                .getUniqueResult();
    }

Вот метод modifyArticle (), который в основном удаляет / обновляет запись статьи в базе данных.

modifyArticle(Article article, int quantity){

 if(article.getQuantity()<quantity){
     dao.delete(article);
 }

 else{
   article.setQuantity(article.getQuantity()-quantity)
   dao.updateArticle(article);
  }
}

// DAO для updateArticle

@Transactional
updateArticle(Article article){
   sessionFactory.getCurrentSession().saveOrUpdate(article);
}

Скажем, вначале в дБ, статья имеет количество 10.

Я породил 2 потока для обновления количества товара, первый поток порожден с количеством = 2, второй поток с 3. Так что в идеале DB после обеих обработок должен быть 5 (10-2-3).

Но для базы данных net количество в дБ равно либо 8 (10-2) / 7 (10-3).

Может кто-нибудь помочь мне понять, почему PESSIMISTIC_LOCKING не работает и что можно обойти, чтобы это исправить?

1 Ответ

0 голосов
/ 26 февраля 2020

После получения блокировки, если я сделал session.refre sh (entity), я получил обновленное значение.

...