Hibernate и многопоточность

164
11 марта 2018, 22:40

Здравствуйте. Прошу разъяснить особенности работы 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();
}

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

Вопрос: как устранить ошибку множественных покупок в многопоточном тесте?

READ ALSO
Отправка pdf файла ajax

Отправка pdf файла ajax

На странице есть много текстовых полей и среди них есть поле с типом file, для загрузки pdf файла

169
Как сделать вывод datepicker jquery слева от input?

Как сделать вывод datepicker jquery слева от input?

ЗдравствуйтеЕсть datepicker jquery

209
Как сделать так, чтобы элемент появлялся за 50px до верха страницы? [требует правки]

Как сделать так, чтобы элемент появлялся за 50px до верха страницы? [требует правки]

Как сделать так, чтобы при прокрутке страницы вниз больше чем на 50px от верха, показывался элемент с классом "main-mai-logo"

186
помогите с расширением получения айпи

помогите с расширением получения айпи

ребят надо мне написать расширение которое показывает ip пользователя я написал вот так

182