【发布时间】:2019-02-15 11:15:58
【问题描述】:
要求
我想要一种以连续序列生成新的唯一编号(发票编号)的方法(生成新编号时不应遗漏任何编号)
有效示例:1、2、3、4
无效示例:1、2、4、3(不连续)
当前架构
我想出的解决方案
在做了一些研究之后,我想出了下面的代码,它现在似乎可以工作了。
DECLARE @i as int=0
While(@i<=10000 * 10000)
BEGIN
Begin Transaction
Insert Into Test(UniqueNo,[Text])values((Select IsNull(MAX(UniqueNo),0)+1 from Test with (TABLOCK)),'a')
COMMIT
SET @i = @i + 1;
END
测试
我尝试从 12 个不同的 SQL 查询或 12 个线程运行代码,目前即使在插入 162,921 行
@987654322 之后,它也会为每条记录生成新的唯一值@
主要问题
上面的代码会导致重复值吗?
我通过点击和试用方法进行了尝试,当我深入了解 Transaction Locking 选择时,它完美地工作但是语句为整个表生成一个共享锁,这意味着它将允许并发事务访问相同的数据,对吧?
也就是说,多个交易可以产生重复的值,对吧?
那我怎么还看不到任何重复的值呢?
编辑
根据大卫的评论
我不能使用身份字段,因为在任何情况下,如果我删除一条记录,我将很难填写该数字。
【问题讨论】:
-
为什么不直接使用 IDENTITY column 让 SQL Server 为您创建值?
-
@DavidG 因为如果有人删除任何行,那么我将无法再使用该号码
-
@SeanLange 如何解决 OP 删除发票的问题?这显然打破了顺序的性质,你不能把它们全部重新编号吗?
-
@DavidG 也许问题应该是为什么在世界上首先要删除发票?我提供它只是作为我参与的项目处理完美顺序编号方式的一个例子。
-
@SeanLange 确实如此。具有连续值并能够删除的要求是互斥的,再多的 TABLOCK 也无济于事。
标签: sql-server transactions sql-server-2008-r2 locking