синхронизированный метод для доступа к базе данных с помощью Spring и Hibernate - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица, в которой хранится порядковый номер, который используется в качестве идентификатора для нескольких таблиц ( в таблицах с несколькими счетами-фактурами во всех таблицах используется одна последовательность ). Всякий раз, когда я хочу вставить новую запись в таблицу счетов, я читаю текущий порядковый номер из таблицы и обновляю его +1. Проблема заключается в том, что при наличии нескольких запросов на новые номера счетов-фактур порядковый номер возвращает повторяющиеся номера. Я пытался синхронизировать блок, но он по-прежнему возвращает повторяющиеся значения при одновременном обращении нескольких запросов.

Вот метод получения порядкового номера

synchronized public int getSequence(){
  Sequence sequence = getCurrentSession().get(Sequence.class,1); //here 1 is the id of the row
  int number = sequence.getSequenceNumber();
  sequence.setSequenceNumber(number+1);
  getCurrentSession().saveOrUpdate(sequence);
  return number;
}

Что-то мне не хватает?

1 Ответ

0 голосов
/ 05 июля 2019

Прежде всего, я не буду рекомендовать вам использовать табличную реализацию последовательности. Объяснение, почему

Но если вам нужно - hibernate знает, как им управлять. Взгляните

И еще одна вещь.Я настоятельно рекомендую вам реализовать синхронизацию на стороне базы данных.Представьте, что у вас есть 2 экземпляра приложения, подключенных к одному экземпляру базы данных и работающих одновременно.

...