java - 如何防止异常时自动递增?

标签 java mysql hibernate

有一个实体 Score,其中 record_id自动递增

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "record_id", unique = true, nullable = false)
public Integer getRecordId() {
    return recordId;
}

但某些操作可能会出现错误

Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Score record = new Score();
try {
    session.save(record);
} catch (ConstraintViolationException e) { ...

问题是错误时 record_id 计数器内部增量 在下一次成功的保存操作中,数据库中的行之间存在间隙,例如,其中 69 和 71 是成功操作时写入的内容,但在 70ts 上出现错误。

69   1    6    2016-12-03
71   2    6    2016-12-03

有没有办法防止错误增加?

最佳答案

没有办法避免这种情况,但你也不应该在意。

序列上的增量是一种单向操作。这样做是为了性能。递增序列必须是原子操作,因为多个进程可能需要同时插入行,这需要交错 ids。

在插入爆炸或有人手动执行某些操作占用某些 id 或多种原因的情况下,预计会出现 id 间隙。您无法完全阻止它。

重要的是,您的应用程序不应该关心间隙。自动递增键是一个代理键,不应依赖其值作为任何特定值。如果你的系统需要连续的 id,那就是一种设计味道。

关于java - 如何防止异常时自动递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948033/

相关文章:

java - Eclipse 已导出 keystore 文件但未导出 .apk

java - 在 php 中。显示一个长字符串作为java代码显示

mysql - 更新表中选定 ID 的多行

java - 升级到 Hibernate 4.1 和 "infamous"HibernateTemplate

java - JPA-Hibernate教程: Explicit persistence provider error-Could not create Configuration

java - 如何使用 Spring boot JPA 配置动态多数据源

java - 为什么我在测试自动更新订阅的苹果沙盒服务器的回复中得到 21004 作为状态值?

Javascript 将一个表拆分为多个表

mysql - 如何根据上个月最畅销的基于mysql查询的样式对Magento中的产品进行排序?

java - 克服 Hibernate 5 连接限制