Разрыв последовательности в 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 шт):

Автор решения: 0xdb

Таким образом, получаются строки, 1, 3, 5, 6, 8 ... Как это исправить ?

Это не надо исправлять.

  1. Последовательности гарантируют уникальность выделенныx значений в мультипользовательской среде.

  2. Значения выделенные последовательностью могут иметь пропуски, именно затем, чтобы обеспечить уникальность в пункте 1.

  3. Попытки избежать пропусков для порядковых номеров другими решениями, отличными от последовательностей, например с max(id)+1, приведут к тому, что эти решения либо не обеспечат уникальности, либо будут крайне неэффективны в мультипользовательской среде.

  4. Порядковый номер записи без пропусков можно получить псевдоколонкой ROWNUM, но это порядковый номер записи в наборе результата запроса, а не в таблице.

кроме того заметил, что строка с порядковым номером 4, может стоять первой в строке таблицы (ред.авт.: первой строкой в таблицe)???

  1. В SQL отсутствует понятие первая или последня строка в таблице. Порядка записей в таблице, связанного со значениями в какой-либо колонке, не существует.

  2. Порядок записей в наборе результата запроса гарантируется только с ORDER BY. И только в самом внешнем подзапросе, если полный запрос состоит из подзапросов.

→ Ссылка