Java 如何在分布式系统中避免数据库ID冲突

Java 如何在分布式系统中避免数据库ID冲突,java,mysql,sql,database,Java,Mysql,Sql,Database,我正在为计算机科学课程编写一个java应用程序。我的问题在这个项目范围内不是什么问题,但可能会对现实世界和我的同学造成严重破坏,我想不出解决办法。这是一个设计在客户端上运行的系统,然后与数据库联系以读取和写入信息 情景: 订单对象由订单Id、一些其他属性和项目数组组成。每个项目都有一个id,因此我们能够找到的存储它们的最佳方法是使用一个表,其中每一行都有订单id和相应的项目id。到目前为止非常简单。问题是为了拥有唯一的ID,我们必须让数据库设置它们。这可以通过自动增量轻松完成,现在订单id是在将

我正在为计算机科学课程编写一个java应用程序。我的问题在这个项目范围内不是什么问题,但可能会对现实世界和我的同学造成严重破坏,我想不出解决办法。这是一个设计在客户端上运行的系统,然后与数据库联系以读取和写入信息

情景: 订单对象由订单Id、一些其他属性和项目数组组成。每个项目都有一个id,因此我们能够找到的存储它们的最佳方法是使用一个表,其中每一行都有订单id和相应的项目id。到目前为止非常简单。问题是为了拥有唯一的ID,我们必须让数据库设置它们。这可以通过自动增量轻松完成,现在订单id是在将订单插入数据库的过程中创建的。下一步是从数据库中检索新订单id,并使用它将项目添加到第二个表中。这里的主要问题是,在这两个步骤之间,有人可以创建一个新订单,这将导致创建的第二个订单将所有项目分配给它,而不是第一个订单


我们理解,客户机-服务器模式可以通过让一个客户机与数据库交互而不是多个客户机来解决这一问题,但除了移动到客户机/服务器模式之外,是否真的没有解决此问题的方法?

自动递增的数字在理想情况下不是正确的选择,因为它提供了一个根据数据库查询和提取信息的机会串行分配的ID。这是UUID通常出现在图片中的位置。大多数数据库提供UUID的生成以及不同的策略。在您的例子中,因为您已经用MySQL标记了您的问题,所以您可以查看以下文档

假设使用UUID生成的值是唯一的(即使跨机器,生成逻辑也会考虑MAC地址)。正如文档所示,它仍然有可能失败,但这是一种非常罕见的情况


另一个选项是生成您自己的UUID,它在生成随机部分时考虑成员/节点ID。这将确保您在主机之间具有唯一的值

有很多方法可以解决这个问题,其中之一就是将insert语句放入您调用的数据库中存储的函数中,而不是直接执行insert。这样,当您调用函数时,它将执行插入并返回ID,而不必去检索它,这意味着您将始终拥有正确的ID。