Разрыв последовательности в Sequence Generator во время rollback transaction при работе в Oracle и Hibernate
Я использую
- Spring boot 2.x
- Spring Data Jpa
- Hibernate
- Oracle 11.x
...
@Id
@SequenceGenerator(name = "jpaSequence.Company",
sequenceName = "SEQUENCE_COMPANY",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jpaSequence.Company")
private Long id;
...
- Sequence generator:
Increment: 1
Min value: 1
Cache: no cache
Cycle: no cycle
Order: Order
CREATE SEQUENCE SEQUENCE_COMPANY INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE ORDER;
В случае, когда приосходит откат транзакции, то ранее выделенный id, не будет использован при следующей валидной вставке строки в базу данных.
Таким образом, получаются строки, 1, 3, 5, 6, 8 ....
Я также пробовал вот такой подход:
...
@GenericGenerator(
name = "jpaSequence",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@org.hibernate.annotations.Parameter(
name = SequenceStyleGenerator.SEQUENCE_PARAM, value = "SEQUENCE_COMPANY"),
@org.hibernate.annotations.Parameter(name = SequenceStyleGenerator.INITIAL_PARAM, value = "1"),
@org.hibernate.annotations.Parameter(name = SequenceStyleGenerator.INCREMENT_PARAM, value = "1")
}
)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jpaSequence")
private Long id;
...
Также разрыв строк, но кроме того заметил, что строка с порядковым номером 4, может стоять первой в строке таблицы ???
Из документации Oracle:
Когда порядковый номер последовательности генерируется, тогда последовательность увеличивается, независимо от фиксации транзакции или отката транзакции. Если 2 пользователя параллельно увеличивают одну и ту же последовательность, тогда порядковые номера последовательности, что приобретает каждый пользователь, могут иметь пропуски, потому что порядковые номера последовательности генерируются другим пользователем.
Как это исправить ?
Ответы (1 шт):
Таким образом, получаются строки, 1, 3, 5, 6, 8 ... Как это исправить ?
Это не надо исправлять.
Последовательности гарантируют уникальность выделенныx значений в мультипользовательской среде.
Значения выделенные последовательностью могут иметь пропуски, именно затем, чтобы обеспечить уникальность в пункте 1.
Попытки избежать пропусков для порядковых номеров другими решениями, отличными от последовательностей, например с
max(id)+1, приведут к тому, что эти решения либо не обеспечат уникальности, либо будут крайне неэффективны в мультипользовательской среде.Порядковый номер записи без пропусков можно получить псевдоколонкой
ROWNUM, но это порядковый номер записи в наборе результата запроса, а не в таблице.
кроме того заметил, что строка с порядковым номером 4, может стоять первой в строке таблицы (ред.авт.: первой строкой в таблицe)???
В SQL отсутствует понятие первая или последня строка в таблице. Порядка записей в таблице, связанного со значениями в какой-либо колонке, не существует.
Порядок записей в наборе результата запроса гарантируется только с
ORDER BY. И только в самом внешнем подзапросе, если полный запрос состоит из подзапросов.