Здравствуйте. Прошу разъяснить особенности работы hibernate при использовании нескольких потоков.
Пример: есть функция покупки товара в интернет-магазине; если товар на складе есть в достаточном количестве, то осуществляется покупка. Код функции примерно такой:
Session session = sessionFactory.openSession();
try {
session.getTransaction().begin();
// запрос количества товара из БД;
// если товара меньше, чем нужно клиенту, то откат транзакции,
// в противном случае - успешное оформление покупки
session.getTransaction().commit();
}
catch ( Exception e ) {
if ( session.getTransaction().getStatus() == TransactionStatus.ACTIVE
|| session.getTransaction().getStatus() == TransactionStatus.MARKED_ROLLBACK ) {
session.getTransaction().rollback();
}
}
finally {
session.close();
}
Проблема возникает при тестировании функции.
1. Если тест однопоточный, то всё отрабатывает нормально и товар при покупке списывается со склада в количестве, соразмерном количеству покупок.
2. Если вызов функции покупки товара запустить в нескольких потоках (имитация работы web-клиента), то товар будет покупаться столько раз, сколько потоков запущено, но спишется со склада только один раз.
3. Если в тесте добавить паузу между запусками потоков, например 1 сек
for (Thread thread : threads){
Thread.sleep(1000);
thread.start();
}
то тест отрабатывает нормально, то есть количество списываний товара со склада соразмерно числу покупок.
Вопрос: как устранить ошибку множественных покупок в многопоточном тесте?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
На странице есть много текстовых полей и среди них есть поле с типом file, для загрузки pdf файла
Как сделать так, чтобы при прокрутке страницы вниз больше чем на 50px от верха, показывался элемент с классом "main-mai-logo"
ребят надо мне написать расширение которое показывает ip пользователя я написал вот так