Java 数据库序列如何管理竞争条件?
我正在编写一个应用程序,它将部署在n个节点上。应用程序实体类使用序列生成策略来生成主键。因为,会有批量插入;我们还将给出分配规模 问题在于应用程序何时将部署在n个节点上,以及两个节点是否同时从数据库中定义的序列请求下一个序列:Java 数据库序列如何管理竞争条件?,java,database,hibernate,rdbms,race-condition,Java,Database,Hibernate,Rdbms,Race Condition,我正在编写一个应用程序,它将部署在n个节点上。应用程序实体类使用序列生成策略来生成主键。因为,会有批量插入;我们还将给出分配规模 问题在于应用程序何时将部署在n个节点上,以及两个节点是否同时从数据库中定义的序列请求下一个序列: 不会有任何比赛条件吗 或者序列也有一些轻量级的锁定机制来按顺序服务请求,就像它在身份策略中发生的那样 或者顺序不是解决这个问题的正确方法 请帮忙。谢谢大家! 将序列视为一个表,其中一列存储一个表示当前id的整数。每次插入一个新条目时,下一个操作将在事务中进行: 读取序列
请帮忙。谢谢大家! 将序列视为一个表,其中一列存储一个表示当前id的整数。每次插入一个新条目时,下一个操作将在事务中进行:
- 读取序列表中的当前值
- 该值作为ID分配给新条目
- 序列中的值递增
当我们在hibernate中命名一个序列时,我们没有在那里给出任何隔离级别:@SequenceGenerator(name=“book\u generator”,sequenceName=“book\u seq”,allocationSize=50)。那么,它是否在数据库的默认隔离级别上工作,即在oracle的情况下可以读取?或者,如果我将隔离级别更改为READ_UNCOMMITTED,我是否会期望它失败?如果没有指定隔离级别,正如您所指出的,它将默认为数据库的默认级别。如果您将默认值更改为READ_UNCOMMITTED,我预计它可能会失败,但这将是一个未完成的配置,因为在您的场景中,您显然需要至少由数据库强制执行写锁。回答得好。您可以添加一个注释,说明由于txn回滚,序列中的一些数字可能会未使用。存储在数据中的一系列数字将有“漏洞”。这是一个特性,不是bug。但对于发票号码这样的东西,你需要另一个方案,因为在这种情况下,缺少数字对会计师和审计员来说是不可接受的。谢谢Alexorlea。我现在有另一个疑问,如果有一个单独的表为序列维护,并且数据库隔离级别决定了它在竞争场景中的一致性,那么它与表策略有何不同,如果在表的id行上使用悲观锁将所有事务按顺序排列?为了强制事务的隔离级别,数据库引擎使用数据库锁。这些锁的粒度(我们是否锁定了表、表中的一系列条目、条目本身等等)是许多优化的主题,不同的引擎有不同的粒度。因此,如果我正确理解了您的问题,那么锁的粒度就会有所不同。