我尝试了各种各样的事情,但到目前为止我还没有找到解决办法......
我们有一个带有OrderID字段的Orders表,该字段当前是IDENTITY值。这对我的客户造成了问题,因为虽然ID大多是顺序的,但偶尔会有大量的1000个ID跳转。我对此进行了研究,发现它是一个"功能" SQL,我在Azure上无能为力。
因此我想自己分配OrderId值,但这说起来容易做起来难。订单来自多个来源,包括多线程导入程序,所以我有并发问题需要处理。
我尝试过使用事务和表锁的存储过程,但是当我调用SaveChanges()(在Entity Framework中)时,我仍然会遇到外键冲突。
{{1}}
我迷失了下一步的尝试......
答案 0 :(得分:1)
外键违规
我希望你的意思是“主键”,因为外键违规与此问题无关......
TABLOCK
是一个可共享的读锁定。使用TABLOCKX
进行快速修复。
我认为您应该使用UPDLOCK, ROWLOCK, HOLDLOCK
这是一个众所周知的标准锁定提示序列。
请注意,您根本不需要使用sprocs。您只需执行语句
SELECT MAX(OrderId)
FROM orders.Orders
WITH (UPDLOCK, ROWLOCK, HOLDLOCK)
并丢弃结果。然后,正确的锁定,您可以使用正常的EF功能继续。