为不同的实体生成序列

时间:2018-05-21 12:12:10

标签: c# sql-server

在我们的应用程序中,我们有不同的项目类型,比如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

  • 我可以创建一个单独的表,存储每个项类型的序列号。
  • 从此表中获取最新信息,使用它,将其递增1,然后更新此表
  • 如果我们在代码中没有实现任何锁定机制,这个解决方案可能会导致两个项目具有相同的编号。

解决方案-2

  • 对于每个项目类型,我们在DB
  • 中定义一个序列
  • 使用下一个值获取下一个序列号

  • 在这种方法中,我们不必在代码中执行任何锁定机制。

请建议前进的方法是什么,或者有更好的方法来实现它。

3 个答案:

答案 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,你得到你想要的东西。