考虑到SQL Azure联合不支持Identity属性或序列,在插入记录时生成序号的有效方法是什么? 例如,给定具有这些列的表:

CREATE TABLE [dbo].[Orders] (
    [TenantId] [uniqueidentifier] NOT NULL,
    [OrderId] [uniqueidentifier] NOT NULL,
    [OrderNumber] [int] NOT NULL
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
        [TenantId] ASC,
        [OrderId] ASC
    )
) FEDERATED ON ([FederationKey] = [TenantId])
.

对于为给定租户插入的每个订单,orderID应该递增。例如,对于遗传,OrderID将是1,2,3 ......对于租户B,B OrderID也将是1,2,3 ...以独立的顺序。理想情况下,没有间隙。

tenantid和orderId是主键的组件。它们的值由应用程序设置,它们与生成序列的问题无关;只有OrderID拥有业务意义的序号。此外,Tenantid是联邦的分布密钥。

这个msdn博客文章在选项1中描述了一种方法,该方法具有保持序列的表,并在分离的事务中使用存储过程来递增序列。每个租户将在此表上包含序列的最后使用值的记录。

这将是考虑可扩展性,争用,资源锁定的最佳方法吗?考虑SQL Azure联合会的局限性,任何其他有用的技巧?

有帮助吗?

解决方案

这里有2个额外的想法。

一种方法是具有单独的进程更新该字段以使其异步,如果这是您的业务场景的可能性。您需要具有OrderNumber字段接受此方法的空值。要知道哪个订单首先,它可以获得正确的OrderNumber,我还会添加一个插入的字段。如果您有多个Worker角色执行此义务以进行冗余,则异步处理会更复杂,在这种情况下,您需要拥有每个进程为其分配它正在处理的记录(因此您还需要一个源性字段),请在此期间添加并发测试更新以确保每个进程在其自己的记录上执行,并且如果进程崩溃使得它不会离开孤儿,则会使记录的分配过期(所以您也需要一个赋率字段)。不是真的很琐碎......

然后你有穷人的男人的方法......当星星对齐自己就足够好时可能是你所需要的。如果您愿意具有乐观的并发方法,请在插入期间尝试使用下一个数字(首先为给定的租户和orderID选择Max OrderNumber),然后执行插入。如果插入失败(因为您在TenantID上添加了唯一索引,则此目的的OrderNumber),只需将1添加到OrderNumber。这里的真正问题是重试的频率和这种方法的可能性失败。如果您有相对简化的业务流程,这实际上可能永远不会失败;但是,如果您有多个途径的订单不断地添加,这可能是一种不可接受的方法。

其他提示

不确定适合您的场景需要多少努力,但也看一下,看看你是否可以调整它:雪地制造商 - Azure的唯一ID发电机(或任何其他云托管环境)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top