java—如何避免分布式系统中的数据库id冲突

t9aqgxwy  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(265)

我正在为计算机科学课写一个java应用程序。我的问题不是这个项目范围内的问题,但可能会对现实世界和我的同学造成严重破坏,我想不出解决办法。这是一个在客户机上运行的系统,然后与数据库联系以读取和写入信息。
场景:order对象由一个order id、一些其他属性和一个项目数组组成。每个项目都有一个id,所以我们能想到的存储它们的最佳方法是使用一个表,其中每一行都有订单id和相应的项目id。到目前为止已经足够简单了。问题是为了拥有唯一的id,我们必须让数据库设置它们。这很容易通过自动递增完成,现在订单id是在将订单插入数据库的过程中创建的。下一步是从数据库中检索新的订单id,并使用它将我们的项目添加到第二个表中。这里的主要问题是,在这两个步骤之间,有人可以创建一个新订单,这将导致创建的第二个订单将所有项目分配给它,而不是第一个订单。
我们知道客户机-服务器模型可以通过让一个客户机与数据库交互而不是多个客户机来解决这个问题,但是除了转移到客户机/服务器模型之外,是否真的没有解决这个问题的方法呢?

2q5ifsrm

2q5ifsrm1#

自动递增的数字在理想情况下并不是正确的选择,因为它提供了一个基于串行分配的id查询和提取信息的机会。这就是uuid通常出现在图片中的地方。大多数数据库提供uuid的生成以及不同的策略。在您的例子中,因为您已经用mysql标记了您的问题,所以您可以查看以下文档
https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid
假设使用uuid生成的值是唯一的(即使跨多台计算机,生成逻辑也会考虑mac地址)。正如文档所示,它仍然有可能失败,但这是一种非常罕见的情况。
另一个选择是生成自己的uuid,它在生成随机部分时考虑成员/节点id。这将确保跨主机具有唯一的值。

相关问题