Итак, необходимо добавить блокировку в строке. Я предлагаю реализовать блокировку с двойной проверкой с использованием блокировок БД - https://en.wikipedia.org/wiki/Double-checked_locking).
1 - начать транзакцию (например, аннотацию @Transactional для вашего метода обслуживания)
2 - Извлечение сущности из базы данных в режиме блокировки PESSIMISTIC_WRITE (обязательно указывайте в спящем режиме, что копия fre sh должна считываться вместо копии, сохраненной в кеше сеанса)
3 - Выполнить изменение / обновление на поле
4 - Сохраните сущность (и убедитесь, что flu sh значение в БД, если вы не хотите ждать auto-flu sh)
5 - Зафиксируйте транзакцию (выполняется автоматически при использовании @Transactional)
Пока ваша транзакция блокирует строку целевого объекта / базы данных, предотвращая ее чтение другими транзакциями в процессе обновления.
Реализация выглядит следующим образом:
@Transactional
public void updateValue(int id) {
final Session session = this.sessionFactory.getCurrentSession();
final Table1 table = session.get(Table1.class, id,LockMode.PESSIMISTIC_WRITE);
session.refresh(table);
table.setCount(table.getNoteCount()+1);
session.saveOrUpdate(table);
session.flush();
}
Надеюсь, это поможет.