34,593
社区成员
发帖
与我相关
我的任务
分享
异步生成序列
--步骤1:建立一个带有标识列的 AsyncSeq
CREATE TABLE AsyncSeq(val INT IDENTITY(1,1))
--步骤2:建立SP Usp_AsyncSeq,生成新的序列值并通过输出参数@val返回
CREATE PROC Usp_AsyncSeq
@VAL INT OUTPUT
AS
BEGIN TRAN
SAVE TRAN S1;
INSERT INTO AsyncSeq DEFAULT VALUES;
SET @VAL=SCOPE_IDENTITY()
ROLLBACK TRAN S1;
COMMIT TRAN
GO
/*说明:
该存储过程打开一个事务并创建保存点S1。它在AsyncSeq表中插入一个
新的标识值并保存到@val中。然后回滚INSERT操作。但是回滚不会撤销变量
赋值,也不会撤销递增标识值的操作。而且,标识资源不会在外部事务期间
被锁定,只是在递增时锁定一小下。identity属性的这个行为时异步序列机
制的关键所在。
回滚到保存点可以保证操作不会影响外部事物。回滚可以防止AsyncSeq
表增长。这样AsyncSeq就不存在任何行。
*/
--示例
--如果你想得到下一个序列号,运行Usp_AsyncSeq,就和同步机制时一样
--好处是在外部事务中递增序列不会阻塞序列。不足是一次只生成一个序列。
declare @val int
exec Usp_AsyncSeq @val output
select @val
(1 行受影响)
-----------
1
(1 行受影响)
--如果需要重置序列的时候执行
TRUNCATE TABLE AsyncSeq
OR
DBCC CHECKIDENT('DBO.AsyncSeq',RESEED,0)