Последовательность PostgreSQL внезапно за данные о таблице по нескольким объектам - без ручных вставок, без пробеловJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Последовательность PostgreSQL внезапно за данные о таблице по нескольким объектам - без ручных вставок, без пробелов

Сообщение Anonymous »

Мы испытываем критическую и неожиданную проблему в нашей системе производства Spring Boot, поддерживаемой PostgreSQL. Несколько дней назад началась следующая ошибка в нескольких операциях сохранения сущностей: < /p>

Код: Выделить всё

ERROR: duplicate key value violates unique constraint "lifecycle_event_pkey"
Detail: Key (id)=(2914) already exists.

org.springframework.dao.DataIntegrityViolationException:
could not execute statement; SQL [n/a]; constraint [lifecycle_event_pkey];
nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
< /code>
Это впервые появилось в методе транзакции, обрабатывающего действие по отслеживанию активов. Он использует Spring Data JPA с @transactional 
и сохраняет сущности, расширяющие общий корень базовый класс. Автогенерировать идентификаторы через @GeneratedValue (стратегия = GenerationType.Identity)

Факты ключевых факторов:
  • Затронутые объекты все расширяют общий root , который определяет ID поэта Class = "Lang-Java PrettyPrint-Override">

    Код: Выделить всё

    @MappedSuperclass
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public class Root {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    // Additional audit fields...
    }
    
  • Один и тот же корень класс используется в нескольких модулях/службах
  • Нет недавних развертываний или схемы (последнее развертывание было ~ 2 месяца назад)
  • nemplaual nemplu Импорт был выполнен
  • Идентификатор таблицы в столбце было нет пробелов ( was continuous)
  • The error appeared in a method annotated with @Transactional, and occurred during a saveAndFlush() operation
  • The issue was resolved by syncing the sequence with:

    Код: Выделить всё

    SELECT setval('lifecycle_event_id_seq', (SELECT MAX(id) FROM lifecycle_event));
    < /code>
    < /li>
    < /ul>
    Однако это исправление реактивно. Теперь мы сосредоточены на определении того, что заставило последовательность отставать в первую очередь. Все эти таблицы простираются из одного и того же нанесенного нанесенного на карту суперкласс (Root< /code>), и все полагаются на PostgreSQL, чтобы автоматически генерировать первичные ключи. strategy
    [*]Sequences were in sync until recently
    [/list]
    We've ruled out:
    
    
    
    Suspected Cause
     Статус < /th>
     Примечания < /th>
    < /tr>
    < /thead>
    
    
     ручные вставки с explicit id < /code> < /td>
     не выполнены.  /> < /tr>
    
     Миграция данных или ETL < /td>
     Миграция данных не проводилась в пораженных таблицах < /td>
     < /td>
    < /tr>
    
     hibernate misconfigat Identity 
    без @genericgenerator или манипуляция с ручной последовательности



    Замечания в таблице
    none - ids не были непрерывными /> < /tr>

    Дрифт размера распределения (

    Код: Выделить всё

    SEQUENCE
    стратегия)
    не применимо - используя идентификацию стратегия



    конфликт общей последовательности
    имеет свою собственную последовательность (подтвержден PG_GET_SERIAL_SECENTENT )




    Наши лучшие гипоте:


    offity < /th>
    вероятность < /th>
    Notes < /th>
    < /tr>
    < /thead>


    postgresql sequence coster /> возможный
    , если кэш >, значения в памяти могут быть потеряны при сбое и не синхронизировать обратно в диск


    вставьте откат во время транзакции перед NextVal

    />Especially since the error appeared in a method using @Transactional


    Hibernate reused detached entity with existing id
    Unlikely
    No such logic is present in our service code


    Concurrent app using same table with broken ID strategy
    Unlikely
    No evidence of conflicting ID generators across services



    Given that no manual Вставки, миграции или изменения схемы были сделаны, и в данных таблицы не было пробелов, что может привести к неожиданному отстранению последовательности PostgreSQL, особенно при использовании: < /p>
    • Код: Выделить всё

      @GeneratedValue(strategy = GenerationType.IDENTITY)
    • a @mampedsuperclass с помощью table_per_class наследование
    • Метод, обернутый в @transactional
    Внутри известных случаев:

    ​​ Транзакция не выдвигает последовательность?>

    Подробнее здесь: https://stackoverflow.com/questions/795 ... ies-no-man
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»