【问题标题】:Sequence Table values increments although transaction is rolled back尽管事务回滚,但序列表值会增加
【发布时间】:2014-12-23 09:19:28
【问题描述】:

我需要对某些表 ID 进行无间隙序列,因此我创建了序列表,尽量避免在每次插入时选择 Max,总计数将用于其他任务

@Id
@TableGenerator(name="ProcedureTypeIdGen", table="REF_SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT", pkColumnValue="SEQ_PROCEDURE_TYPE", allocationSize=1, initialValue=0)
@GeneratedValue(strategy=GenerationType.TABLE, generator="ProcedureTypeIdGen")
@Column(name="PROCEDURE_TYPE_ID")
private Long id;

但是每次我向PROCEDURE_TYPE插入一个值时,序列值总是递增,尽管事务回滚了,因为一个异常并且PROCEDURE_TYPE表中没有插入任何数据!

【问题讨论】:

  • 一个序列表被多个 EntityManagers 使用,因此使用它自己的独立 Connection 比锁定所有 EntityManagers 直到每个 EntityManagers 都被提交更有意义
  • 在可能的情况下会有一个 EntityManager,并且如果稍后添加任何一个(任何其他模块),则此模块不应使用此表,并且其他模块也不应将数据插入这些表中,也插入此表应该是在非常罕见的情况下
  • 一些 JPA 实现允许控制它是否将使用与 EntityManager 相同的连接(例如,我使用的 DataNucleus JPA)。你的可能没有

标签: java hibernate jpa


【解决方案1】:

有什么让您远离使用 GenerationType.AUTO 的原因吗?

【讨论】:

  • 我正在使用不支持自动增量的 Oracle
猜你喜欢
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2021-05-24
  • 2020-12-31
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多