在我们的应用程序中,我们有不同的项目类型,比如A,B,C,D。
用户可以为每种类型创建一个项目,每个项目都必须有自己的序列号。
A-1 // the next item will have number as 2
B-2 // the next item will have number as 3
C-1
D-1
解决方案-1
解决方案-2
使用下一个值获取下一个序列号
在这种方法中,我们不必在代码中执行任何锁定机制。
请建议前进的方法是什么,或者有更好的方法来实现它。
答案 0 :(得分:1)
我遇到了同样的问题,我开始使用Solution-1,但我最终选择了Solution-2来避免因为防止重复所需的锁而导致的死锁。
您可以定义一个简单的存储过程来管理自定义序列。它将在必要时创建一个新序列,并返回相应序列的下一个值。
CREATE PROCEDURE [dbo].[CUSTOM_SEQUENCES_NewValue]
@TYPE nvarchar(32),
@VALUE int out
AS
declare @SEQUENCE nvarchar(64);
declare @SQL nvarchar(128);
BEGIN
set @SEQUENCE = N'SEQ_CUSTOM_SEQUENCE_' + @TYPE
if not exists(select * from sys.sequences where name = @SEQUENCE)
begin
set @SQL = N'create sequence dbo.' + @SEQUENCE + ' as bigint start with 1';
execute sp_executesql @SQL;
end
set @SQL = N'set @VALUE = next value for dbo.' + @SEQUENCE;
exec sp_executesql @SQL, N'@VALUE int out', @VALUE = @VALUE out;
END
答案 1 :(得分:0)
如果您的项目类型没有延伸,那么我会使用Solution-2,但是如果您希望这个增长,那么使用CREATE TRIGGER来增强Solution-1 ... FOR INSERT
答案 2 :(得分:0)
你已经说过了答案。你有不同的项目类型,因此每个A,B,C和D都有不同的表。然后每个项目都有自己的ID,在这种情况下是int,你得到你想要的东西。