Как справиться с оптимистичным обновлением количества заблокированных товаров с одновременными пользователями? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть метод, который обновляет количество товара.

MyEntity имеет свойство версии, аннотированное @Version, как долго.

Есть конечная точка списка элементов /items Также есть конечная точка обновления элементов/item/update (рассматривается как товарный запас, покупка товара)

Таким образом, N одновременных пользователей хотят обновить один и тот же товар.

Но возникает исключение org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1.При обновлении.

А также в это время конечная точка /items не могла вернуть данные.Или ждет, когда пользователь вернется со слишком большой задержкой. (Если обновление пользователей считает слишком много в это время, оно также получает exception timeout).

Итак, как я могу справиться с этой ситуацией без каких-либо пропусков?(Может быть хорошая реализация)

1 Ответ

0 голосов
/ 30 марта 2019

К сожалению, JPA / Hibernate не очень хорошо работает с пакетными вставками, когда возникает конфликт: всякий раз, когда любое исключение выдается в контексте сеанса Hibernate, вам не повезло.

См. 13.2.3.Обработка исключений: https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html#transactions-optimistic

В частности:

Ни одно исключение, выданное Hibernate, не может рассматриваться как восстанавливаемое.Убедитесь, что сессия будет закрыта, вызвав close () в блоке finally.

Раньше мне приходилось переносить код JPA в QueryDSL или использовать необработанный SQL и JdbcTemplate (что-то вроде Как сделать несколько вставок в базу данных с помощью весеннего пакета JDBC Template? ).

...