【发布时间】:2009-10-08 22:41:54
【问题描述】:
我有一个使用事件编号(以及其他类型的编号)的应用程序。这些数字存储在名为“Number_Setup”的表中,其中包含计数器的当前值。
当应用程序生成新事件时,它会在表中编号设置并获取所需的编号计数器行(计数器可以每天、每周等重置,并以 int 形式存储)。然后它递增计数器并使用新值更新行。
该应用程序是多用户的(任何时候大约有 100 个用户,以及运行并获取 100 条事件记录并为每个请求事件编号的 sql 作业)。事件表有一些重复的事件编号,它们不应重复。
存储过程用于检索下一个计数器。
选择 @Counter = 计数器,@ShareId=share_id,@Id=id FROM Number_Setup WHERE LinkTo_ID=@LinkToId AND Counter_Type='我' IF isnull(@ShareId,0) > 0 开始 -- 使用父计数器 选择 @Counter = 计数器,@ID=id FROM Number_Setup 哪里 ID=@ShareID 结尾 选择 @NewCounter = @Counter + 1 UPDATE Number_Setup SET Counter = @NewCounter 哪里 id=@Id我现在已经用事务包围了那个块,但我不完全确定它会 100% 解决问题,因为我认为仍然存在共享锁,所以无论如何都可以读取计数器。
也许我可以在更新语句中检查计数器是否已更新
UPDATE Number_Setup SET Counter = @NewCounter WHERE 计数器 = @Counter 如果@@ERROR = 0 并且@@ROWCOUNT > 0 提交交易 别的 回滚交易我确定这是财务应用等中发票编号的常见问题。
我也不能将逻辑放入代码中并在该级别使用锁定。
我也锁定了 HOLDLOCK 但我不确定它的应用程序。是否应该放在两条 SELECT 语句上?
如何确保不创建重复项?
【问题讨论】:
标签: sql-server transactions rowlocking