Мы испытываем критическую и неожиданную проблему в нашей системе производства 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
< /ul>
- < /> Полево, что идентифицируется, что идентифицирует, что идентифицируется, что идентифицируется, что идентифицируется, что Code> Code> Code> Codes> Codes> Codes> CODE> CODE> CODE> CODE> CODE < /> < /> < /> < />. это: < /p>
Код: Выделить всё
@MappedSuperclass @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class Root { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // Additional audit fields... }
- Один и тот же класс root используется в нескольких модулях/услугах в производстве.
- Нет недавних развертываний или изменений схемы (последнее развертывание было ~ 2 месяца назад). INSERT s или объемный импорт был выполнен на любых затронутых таблицах.был непрерывным).
Код: Выделить всё
MAX(id)
- Ошибка появилась в методе, аннотированном с помощью @Transactional , и произошла во время операции saveAndflush () . с: < /p>
Код: Выделить всё
SELECT setval('lifecycle_event_id_seq', (SELECT MAX(id) FROM lifecycle_event));
Even though:
[*]The same Сервис и кодовая база использовались в течение нескольких месяцев (или лет) < /li>
Несколько сервисов, работающих одновременно с использованием одной и той же схемы и стратегии наследования < /li>
Ранее всегда были синхронизированы < /li>
< /ul>
Suspected Cause
Status
Notes
Manual Вставки с явным идентификатором < /code> < /td>
НЕТ таких операций выполнены < /td>
< /tr>
Migration или ETL < /td>
< /td>
< /td>
загружает < /td>
< /tr>
неправильная конфигурация Hibernate < /td>
с использованием стандартной идентификации < /code>; Нет @GenericGenerator < /code>, нет пользовательской логики идентификации < /td>
< /tr>
Запасы в таблице < /td>
ID непрерывного < /td>
< /tr>
SEQUENCE strategy)
Not applicable — using IDENTITY
Shared sequence conflict
Each table uses its own sequence (
Код: Выделить всё
pg_get_serial_sequence
возможность < /th>
вероятность < /th>
Notes < /th>
< /tr>
< /thead>
Последовательность Postgresql Cache. />
Код: Выделить всё
CACHE
< /tr>
вставьте откат во время транзакции < /td>
⚠ возможна < /td>
, особенно в рамках @transactional < /code>; Последовательность может не продвигаться, если nextval () не достигнут
Hibernate повторный отдельный отдельный объект с существующим идентификатором
нет такого рисунка в Service Code в Service in Service Code в Service Code>
нет такого рисунка. />
Another app using different ID strategy
All apps use the same base class and IDENTITY strategy
не дает ручных вставок, миграций или идентификационных пробелов: < /p>
, что может вызвать автоматическую последовательность Postgresql (
Код: Выделить всё
IDENTITY
Код: Выделить всё
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Transactional< /code> Методы службы с использованием saveandflush () < /code> < /li>
< /ul>
< /blockquote>
postgresql replests или restes или crashs и lose sequence cach cach>
an postgresql. прерывает транзакцию до значение последовательности продвинуто? />
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/795 ... ies-no-man