Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库序列如何管理竞争条件?_Java_Database_Hibernate_Rdbms_Race Condition - Fatal编程技术网

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

Java 数据库序列如何管理竞争条件?,java,database,hibernate,rdbms,race-condition,Java,Database,Hibernate,Rdbms,Race Condition,我正在编写一个应用程序,它将部署在n个节点上。应用程序实体类使用序列生成策略来生成主键。因为,会有批量插入;我们还将给出分配规模 问题在于应用程序何时将部署在n个节点上,以及两个节点是否同时从数据库中定义的序列请求下一个序列: 不会有任何比赛条件吗 或者序列也有一些轻量级的锁定机制来按顺序服务请求,就像它在身份策略中发生的那样 或者顺序不是解决这个问题的正确方法 请帮忙。谢谢大家! 将序列视为一个表,其中一列存储一个表示当前id的整数。每次插入一个新条目时,下一个操作将在事务中进行: 读取序列

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

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

  • 不会有任何比赛条件吗
  • 或者序列也有一些轻量级的锁定机制来按顺序服务请求,就像它在身份策略中发生的那样
  • 或者顺序不是解决这个问题的正确方法

  • 请帮忙。谢谢大家!

    将序列视为一个表,其中一列存储一个表示当前id的整数。每次插入一个新条目时,下一个操作将在事务中进行:

    • 读取序列表中的当前值
    • 该值作为ID分配给新条目
    • 序列中的值递增
    回答你的问题

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

  • 当我们在hibernate中命名一个序列时,我们没有在那里给出任何隔离级别:@SequenceGenerator(name=“book\u generator”,sequenceName=“book\u seq”,allocationSize=50)。那么,它是否在数据库的默认隔离级别上工作,即在oracle的情况下可以读取?或者,如果我将隔离级别更改为READ_UNCOMMITTED,我是否会期望它失败?如果没有指定隔离级别,正如您所指出的,它将默认为数据库的默认级别。如果您将默认值更改为READ_UNCOMMITTED,我预计它可能会失败,但这将是一个未完成的配置,因为在您的场景中,您显然需要至少由数据库强制执行写锁。回答得好。您可以添加一个注释,说明由于txn回滚,序列中的一些数字可能会未使用。存储在数据中的一系列数字将有“漏洞”。这是一个特性,不是bug。但对于发票号码这样的东西,你需要另一个方案,因为在这种情况下,缺少数字对会计师和审计员来说是不可接受的。谢谢Alexorlea。我现在有另一个疑问,如果有一个单独的表为序列维护,并且数据库隔离级别决定了它在竞争场景中的一致性,那么它与表策略有何不同,如果在表的id行上使用悲观锁将所有事务按顺序排列?为了强制事务的隔离级别,数据库引擎使用数据库锁。这些锁的粒度(我们是否锁定了表、表中的一系列条目、条目本身等等)是许多优化的主题,不同的引擎有不同的粒度。因此,如果我正确理解了您的问题,那么锁的粒度就会有所不同。