postgresql 迁移到v3.2.0.Final后的序列同步和重复密钥冲突问题

eit6fx6z  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(147)

最近,我将一个服务从Quarkus 2.7迁移到了最新版本3.2.0.Final。迁移过程进行得很顺利,项目构建也很成功。但是,我在尝试将数据写入PostgreSQL数据库时遇到了一个问题。一开始,我面对的错误是:

Caused by: org.postgresql.util.PSQLException: ERROR: relation "public.revinfo_seq" does not exist
  Position: 16
                at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)
                at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)
                at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)
                at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)
                at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)
                at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:166)
                at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:118)
                at io.agroal.pool.wrapper.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:78)
                at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:

字符串
为了解决这个问题,我将当前序列从info_rev_seq重命名为revinfo_seq,因为Hibernate 6在序列命名策略https://jpa-buddy.com/blog/hibernate6-whats-new-and-why-its-important/中引入了一个更改
修复序列名后,上述问题得到解决。然而,我发现了另一个问题,出现了一段时间后。
我遇到以下错误:

org.hibernate.exception.ConstraintViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "pk_revinfo"
Detail: Key (rev)=(60) already exists.] [insert into public.REVINFO (REVTSTMP,REV) values (?,?)]
  at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:95)
  at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56)
  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)
  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:278)
  at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.performNonBatchedMutation(AbstractMutationExecutor.java:108)
  at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:40)
  at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:53)
  at org.hibernate.persister.entity.mutation.InsertCoordinator.doStaticInserts(InsertCoordinator.java:170)
  at org.hibernate.persister.entity.mutation.InsertCoordinator.coordinateInsert(InsertCoordinator.java:112)
  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2761)
  at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:102)
  at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:606)
  at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
  at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:358)
  at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
  at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
  ...
  Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_revinfo"
  Detail: Key (rev)=(60) already exists.


revinfo表的结构如下所示:

create table revinfo
(
    rev      bigserial,
    revtstmp bigint
);

alter table revinfo
    add constraint pk_revinfo
        primary key (rev);


经过调查,很明显,序列变得不同步。例如,revinfo表包含54行,但sequence得值为23.我手动修复了序列以与正确的值对齐,但它最终再次失去同步。
该问题似乎与序列同步有关。虽然具体原因尚未确定,但事务回滚、并发操作或不正确的序列管理等因素可能会导致该问题。
我怀疑到Quarkus 3.2.0.Final的迁移可能影响了行为,因为在迁移之前序列同步工作正常。
我还使用Hibernate Envers来审计我的表,包括revinfo表。但是,由于即使没有引用主表中的revinfo表也会出现问题,因此问题似乎出在序列同步上,而不是审计本身。
是否有人遇到过类似的问题,并能提供解决问题和确定其根本原因的建议?在解决上述序列同步问题时,您的见解和建议将非常感谢。
请随时分享任何有助于有效排除故障和解决问题的经验或建议。提前感谢您的帮助
P.S.正在使用的数据库是PostgreSQL

xmq68pz9

xmq68pz91#

我强烈建议您查看此迁移指南https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.0:-Hibernate-ORM-5-to-6-migration
您遇到的问题最有可能来自于此特定更改,其中默认增量大小从1更改为50。
您可以尝试显式地将增量大小设置回1,看看是否有帮助。

ltskdhd1

ltskdhd12#

您应该将序列的增量大小设置为50。
参见https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.0:-Hibernate-ORM-5-to-6-migration#sequence-increment-size:
使用DDL(SQL,如alter sequence […​])将序列的增量大小设置为正确的值,即设置为标识符生成器的分配大小,自Hibernate ORM 6起默认为50。

相关问题