我知道默认情况下 SQL 语句不会异步执行,但我遇到的情况似乎是这样的。
表
[#data]
[tbl_Bucket]
[tbl_IDPool]
程序
[sp_InsertIntoBucket]
[sp_GenerateID]
[sp_UpdateIDPool]
过程
- 一个应用程序调用
[sp_InsertIntoBucket]
[sp_InsertIntoBucket]
来电[sp_GenerateID]
[sp_GenerateID]
查询[tbl_IDPool]
并生成一个值[sp_GenerateID]
来电[sp_UpdateIDPool]
[sp_UpdateIDPool]
写信给[tbl_IDPool]
[sp_GenerateID]
将其生成的值返回给[sp_InsertIntoBucket]
[sp_InsertIntoBucket]
使用该值作为新记录的主键[tbl_Bucket]
[sp_InsertIntoBucket]
将生成的值返回给调用者
设想
[#data]
有信息(1500 - 12000 条记录)发往[tbl_Bucket]
. 由于[sp_InsertIntoBucket]
一次只能处理一条记录,因此该过程是 RBAR 的——因为每条记录都[#data]
[sp_InsertIntoBucket]
被调用。
问题
[sp_GenerateID]
生成重复值。INSERT
在实际发生[sp_InsertIntoBucket]
并引发错误之前,我已经有 13 到 130 个重复生成的值。
生成的值取决于输入的数据,[tbl_IDPool]
因此[sp_UpdateIDPool]
为每次[sp_GenerateID]
调用调用以确保下一次 [sp_GenerateID]
调用生成唯一值也很重要。
我怀疑这与在完成写入[sp_GenerateID]
之前被第二次调用有关。但这没有意义,因为 RBAR在移动到下一个条目之前应该等待哪个应该等待哪个应该等待,对吧?[sp_UpdateIDPool]
[tbl_IDPool]
[sp_InsertIntoBucket]
[sp_GenerateID]
[sp_UpdateIDPool]
[#data]
我试过的
WAITFOR DELAY "00:00:00.003"
- 这行得通,但我正在寻找更好、更高效、更优雅的解决方案。WHILE
vs.CURSOR
- 唯一的区别是CURSOR
稍慢。- 在希望写入(第一次调用)会锁定读取(第二次调用)
WITH (NOLOCK)
的[sp_GenerateID]
查询中有和没有。[tbl_IDPool]