如何在没有 IDENTITY 的 Azure SQL 中创建顺序自动编号字段?
How to create a sequential auto-number field in Azure SQL without IDENTITY?
我已经尝试了各种方法,但到目前为止我一直无法找到解决这个问题的方法...
我们有一个 Orders table,其 OrderID 字段当前是一个 IDENTITY 值。这一直给我的客户带来问题,因为虽然 ID 大多是连续的,但偶尔会有 1000 个 ID 的大跳跃。我对此进行了研究,发现它是 SQL 的 "feature",而我在 Azure 上对此无能为力。
因此我想自己分配 OrderId 值,但这说起来容易做起来难。订单来自多个来源,包括多线程导入程序,因此我有并发问题需要处理。
我已经尝试过这个使用事务和 table 锁的存储过程,但是当我调用 SaveChanges()(在 Entity Framework 中)时,我仍然遇到外键违规。
CREATE PROCEDURE orders.InsertOrder(
...
)
AS
BEGIN
DECLARE @OrderId INT
BEGIN TRANSACTION
SELECT @OrderId = MAX(OrderId) + 1
FROM orders.Orders
WITH (TABLOCK, HOLDLOCK)
INSERT INTO [orders].[Orders]
([OrderId],
...
)
VALUES
(@OrderId,
...
);
COMMIT TRANSACTION
END
我不知道接下来要尝试什么...
foreign key violations
我希望你的意思是 "primary key" 因为外键违规与这个问题无关...
TABLOCK
是共享读锁。使用 TABLOCKX
进行快速修复。
我认为您应该使用 UPDLOCK, ROWLOCK, HOLDLOCK
,这是一个众所周知的标准锁提示序列。
请注意,您根本不需要存储过程。你只需要执行语句
SELECT MAX(OrderId)
FROM orders.Orders
WITH (UPDLOCK, ROWLOCK, HOLDLOCK)
并丢弃结果。然后,获取适当的锁,您可以使用正常的 EF 功能继续。
我已经尝试了各种方法,但到目前为止我一直无法找到解决这个问题的方法...
我们有一个 Orders table,其 OrderID 字段当前是一个 IDENTITY 值。这一直给我的客户带来问题,因为虽然 ID 大多是连续的,但偶尔会有 1000 个 ID 的大跳跃。我对此进行了研究,发现它是 SQL 的 "feature",而我在 Azure 上对此无能为力。
因此我想自己分配 OrderId 值,但这说起来容易做起来难。订单来自多个来源,包括多线程导入程序,因此我有并发问题需要处理。
我已经尝试过这个使用事务和 table 锁的存储过程,但是当我调用 SaveChanges()(在 Entity Framework 中)时,我仍然遇到外键违规。
CREATE PROCEDURE orders.InsertOrder(
...
)
AS
BEGIN
DECLARE @OrderId INT
BEGIN TRANSACTION
SELECT @OrderId = MAX(OrderId) + 1
FROM orders.Orders
WITH (TABLOCK, HOLDLOCK)
INSERT INTO [orders].[Orders]
([OrderId],
...
)
VALUES
(@OrderId,
...
);
COMMIT TRANSACTION
END
我不知道接下来要尝试什么...
foreign key violations
我希望你的意思是 "primary key" 因为外键违规与这个问题无关...
TABLOCK
是共享读锁。使用 TABLOCKX
进行快速修复。
我认为您应该使用 UPDLOCK, ROWLOCK, HOLDLOCK
,这是一个众所周知的标准锁提示序列。
请注意,您根本不需要存储过程。你只需要执行语句
SELECT MAX(OrderId)
FROM orders.Orders
WITH (UPDLOCK, ROWLOCK, HOLDLOCK)
并丢弃结果。然后,获取适当的锁,您可以使用正常的 EF 功能继续。