我有一个使用事件号码(以及其他类型的号码)的应用程序。这些数字存储在名为“Number_Setup”的表中,该表包含计数器的当前值。确保来自sql server数据库的唯一号码
当应用程序生成一个新的事件时,它number_setup表并获得所需的数量计数器行(计数器可以重置每日,每周等,并存储为整数)。然后递增计数器并用新值更新行。
该应用程序是多用户(每次大约有100个用户,以及运行并抓取100个事件记录并为每个事件请求事件编号的sql作业)。事件表有一些重复的事件编号,它们不应该重复。
存储过程用于检索下一个计数器。
SELECT @Counter = counter, @ShareId=share_id, @Id=id FROM Number_Setup WHERE [email protected] AND Counter_Type='I' IF isnull(@ShareId,0) > 0 BEGIN -- use parent counter SELECT @Counter = counter, @ID=id FROM Number_Setup WHERE [email protected] END SELECT @NewCounter = @Counter + 1 UPDATE Number_Setup SET Counter = @NewCounter WHERE [email protected]
现在我已经包围与事务块,但我不能完全肯定这将100%解决这个问题,我觉得还是有共享锁,因此计数器可以阅读反正。
也许我可以检查计数器尚未更新,在更新语句
UPDATE Number_Setup SET Counter = @NewCounter WHERE Counter = @Counter IF @@ERROR = 0 AND @@ROWCOUNT > 0 COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION
我敢肯定,这是与金融应用的发票编号等
我不能把一个常见的问题代码中的逻辑,并在该级别使用锁定。 我也锁定在HOLDLOCK,但我不确定它的应用程序。它应该放在两个SELECT语句上吗?
我如何确保不会创建重复项?
什么版本的Sql Server? – RBarryYoung 2009-10-08 22:58:19
此刻,2000. – 2009-10-09 00:41:13