3

我们正在构建订单处理系统。我们有一个处理服务器集群。我们需要为订单分配可读的编号(例如 ORD-000001、ORD-000002)。

主要问题是我们很难实现系统范围的锁。我正在考虑锁定过期的模式。但是想到的一切还是有瓶颈的。

我们正在接近 DDD,因此很难直接访问数据库。我们正在使用 NHibernate。我们使用 UnitOfWork。

请帮助一些想法。每个想法都将是有价值的。有什么链接可以阅读有关主题的内容吗?

更新:我想强调,我需要序列号。因此不能使用高/低算法。此时我正在调查场景

  1. 我分配“可能很好的数字”;
  2. 推送到数据库;
  3. 如果失败,尝试分配另一个“可能很好的数字”;
  4. 如果成功,则提交;

但我找不到合适的技术。

4

2 回答 2

2

您是否试图确保所有订单都有唯一编号,但没有协调编号分布的中心位置?

这里有两个选项供您选择。

  1. 假设您希望在任何实际时间段内最多拥有十台服务器。让每个服务器分发 ORD-XXXXN 形式的序列号。N 是服务器的编号。所以服务器 0 分发 ORD-000000、ORD-000010、ORD-000020 等。服务器 6 分发 ORD-000006、ORD-000016、ORD-000026 等。

  2. 分发数字块,一次 10000 个。每台服务器在从某个在后台运行的小型服务器中检索更多数字之前,先用完一个块中的所有数字。小服务器只是一个一个地运行所有的块,一次一个地传递它们。第一个要分发的块是0-9999,第二个是10000-19999,第三个是20000-29999,以此类推。

于 2009-09-21T20:08:13.527 回答
1

以防万一,如果您真的使用单个数据库,为什么不能

CREATE TABLE OrderNumbers (ID INT IDENTITY(1,1), Dummy VARCHAR(1))
INSERT INTO OrderNumbers (Dummy) SELECT ''
SELECT 'ORDER_N' + CONVERT(VARCHAR(50), @@IDENTITY) AS NewOrderNumber

更新:即使您有不同的用户(多租户),如果您的序列号不必为 +1,则 PK 也可以工作 - 即您可以有 1、4、10,而不仅仅是 1、2、3。

更新:或者,正如 jprete 建议的那样,执行以下操作:

CREATE TABLE CustomerOrderNumber (ID INT, CustomerID INT)
CREATE FUNCTION GetMaxId ( @mycustomerid INT ) RETURNS INT
AS BEGIN
 DECLARE @maxid INT
 SET @maxid = SELECT ID FROM CustomerOrderNumber WHERE CustomerID = @mycustomerid
 SET @maxid = @maxid + 1
 UPDATE CustomerOrderNumber SET ID = @maxid
 RETURN @maxid
END
于 2009-09-21T20:52:29.447 回答