可配置的串行跟踪号码生成

时间:2015-05-26 02:58:41

标签: c# sql-server tsql

我正在开发一个基于C#.NET(& TSQL)的项目,该项目需要生成可配置的串行跟踪号,这取决于它所包含的数据。

背景

详细说明,该软件用于跟踪进入工厂的车辆。为每辆车分配一张RFID卡和一个跟踪号码。跟踪号基于卡车前往的许多仓库的第一。管理员可以配置每个仓库的编号格式。这通常如下所示:#YYYYMMDD-XX002211其中XX是每个仓库唯一的前缀。每当月份发生变化时,此数字将从1 重新开始。

在创建主人(车辆+ RFID卡详细信息)时,跟踪编号为null。添加第一行(仓库详细信息)后,系统会生成跟踪编号并将其分配给主服务器。因此,在添加一行之前,跟踪号字段可能有重复,即许多记录null

问题

生成跟踪号的代码是用C#编写的,并使用SQL事务,但跟踪中偶尔会发生冲突,导致系统不稳定。我对TSQL事务进行了更多的研究,以找到Isolation Level settings但是我没有成功使用它们。

解?

我尝试了以下方法:

  • 在更新前检查主表中是否存在重复
  • 使用可重复读取隔离级别来确保在事务执行期间不更新数据

我应该吗?

  • 将整件事移到存储过程?
  • 启动一个守护程序,它负责编号生成,通过单线程执行来确保顺序

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

为简单起见,我建议你让一个存储过程更新并获取序列号,然后用C#进行其他格式化

CREATE PROCEDURE GetSequenceOfWareHouse
    @WareHouse char(2)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Result table (Sequence int)

    BEGIN Tran
        UPDATE SequenceTable SET Sequence = Sequence + 1 
            OUTPUT inserted.Sequence INTO @Result 
        WHERE WareHouse = @WareHouse AND Month = YEAR(GETDATE()) * 100 + MONTH(GETDATE())

        IF NOT EXISTS(SELECT * FROM @Result)
            INSERT SequenceTable (Sequence, WareHouse, Month) 
                OUTPUT inserted.Sequence INTO @Result 
            VALUES (1, @WareHouse, YEAR(GETDATE()) * 100 + MONTH(GETDATE()))

    COMMIT Tran

    SELECT Sequence FROM @Result

END
GO


CREATE Table SequenceTable
(
    Sequence int,
    WareHouse char(2),
    Month int,

    unique (Sequence, WareHouse, Month)
)