java - 数据库序列如何管理竞争条件?

标签 java database hibernate rdbms race-condition

我正在编写一个将部署在 n 个节点上的应用程序。应用程序实体类使用 SEQUENCE 生成策略来生成主键。因为,会有批量插入;我们还将给出分配大小。

关注的是应用程序何时部署在 n 个节点上,以及两个节点是否同时从数据库中定义的序列请求下一个序列:

  1. 不会有任何竞争条件吗?
  2. 或者该序列是否也有一些轻量级锁定机制来按顺序服务请求,就像 IDENTITY 策略中发生的那样?
  3. 或者顺序不是解决这个问题的正确方法?

请帮忙。谢谢!

最佳答案

将 Sequence 视为一个表,其中有一列存储表示当前 id 的整数。每次插入新条目时,下一个操作都会在事务中发生:

  • 读取 SEQUENCE 表中的当前值
  • 该值将作为 ID 分配给新条目
  • SEQUENCE 中的值递增

回答您的问题

  1. 并发问题由数据库解决。
  2. 由于插入发生在事务中(简单插入和批量插入),因此数据库引擎通过事务强制执行 ID 生成的一致性(更准确地说是通过事务的隔离级别)。确保您的数据库引擎支持事务。
  3. 假设您的数据库引擎支持事务,序列是正确的解决方案。

关于java - 数据库序列如何管理竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52350858/

相关文章:

java - 如何从具有不同结果的 Realm 数据库中查询java

java - 使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有什么区别

database - 2个表中的主键

mysql - 数据库设计 : how to model a table?

java - 带有参数 NoSuchMethodError 的 HQL

java - session.save() 反射(reflect)没有事务提交

Java Swing 设置 "actual"帧大小(内部)

java - 使用 Spring 4 处理 FileUploadBase.SizeLimitExceededException

php - 当我在浏览器中运行链接时,如何在尝试将值(在链接中传递)存储到数据库时解决 fatal error ?

java - 带 Hibernate 的独立数据库