powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA (Hibermate) custom sequence
5 сообщений из 30, страница 2 из 2
JPA (Hibermate) custom sequence
    #38502387
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
abc_daivanraЛучше уж сериализацию через синхронизируемый методчто это такое?
Когда мы вставляем записи с применением select max() + 1, то возможна ситуация, когда 2 разные транзакции
- одновременно получили одно и то же значение select max() + 1. При этом, прочитав значение, они должны обеспечить целостность, поэтому они блокируют вставку из чужой транзакции - если чужая транзакция вставит новое значение, то эта транзакция будет неконсистентна;
- теперь они не могут вставить, поскольку заблокировали друг друга - каждая транзакция ждет, когда другая закончится, чтобы самой вставить, либо выдать ошибку о нарушении уникальности - налицо дедлок.
Выход - использовать для вставки сериализуемые транзакции, или хотя бы использовать сериализуемую транзакцию для обращения к сохраненной процедуре, генерирующей идентификаторы.
Но, поскольку заводить дополнительную транзакцию для вставки хлопотно, проще упорядочить генерацию с помощью synchronized метода (метод можно сделать статическим, либо использовать синглтон). По аналогии с бумажным делопроизводством - каждый по очереди подходит и делает запись в журнале о получении номера.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Generator {
...
  private Generator() {
    // прои старте читаем начальное значение из базы с помощью select max
  }
  public Generator instance() {
    // код синглтона
  }
  public synchronized String generate() {
    // используя текущее значение счетчика, получаем ID, счетчик увеличиваем на 1
    ...
  }
}
// и использование типа
  Generator.instance().generate()


Конечно, всё это будет работать, если номера получаем только из этого генератора, поэтому, если приложений много, надо организовывать web-сервис, RMI и тому подобное
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502394
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
конечно же,
Код: java
1.
2.
3.
  public static Generator instance() {
    // код синглтона
  }
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502423
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант - можно сначала прочитать select max() в первой транзакции, закрыть её, затем открыть вторую транзакцию и уже вставлять с новым вычисленным значением, ловить исключение, пробовать по новой и т.д.
но insert into XXX... (select max() ... from XXX), или просто select/insert в одной транзакции - 100% дедлок, если не обеспечена последовательность
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502457
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
ivanraКак вариант - можно сначала прочитать select max() в первой транзакции, закрыть её, затем открыть вторую транзакцию и уже вставлять с новым вычисленным значением, ловить исключение, пробовать по новой и т.д.
но insert into XXX... (select max() ... from XXX), или просто select/insert в одной транзакции - 100% дедлок, если не обеспечена последовательностьЕсли СУБД поддерживает конструкцию типа UPDATE ... RETURNING(...), то изменение может быть атомарным. Запрос делать в отдельной транзакции, запрашивать "пачками", т.е. наращивать на большое число, а сущностям потом отдавать по одному, что позволит сократить количество запросов в базе.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502554
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я делаю так
Код: sql
1.
2.
3.
4.
5.
DECLARE @Counter bigint
UPDATE   CounterAreas SET @Counter = Counter = Counter + 1
WHERE    Counter_ID = ?

SELECT  @Counter as 'counterValue'
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA (Hibermate) custom sequence
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]