可配置的序列号跟踪生成



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

的背景

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

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

生成跟踪号的代码是用c#编写的,并使用SQL事务,但是在跟踪过程中经常发生冲突,导致系统不稳定。我对TSQL事务做了更多的研究,以找到隔离级别设置,但我没有成功。

解决方案吗?

我尝试了以下方法:

  • 在更新
  • 之前检查主表中是否存在可能的副本
  • 使用Repeatable Read隔离级别以确保在事务执行期间不更新数据

我应该吗?

  • 将整个东西移动到存储过程?
  • 启动一个负责生成数字的守护进程,确保单线程执行的顺序

谢谢你的帮助!

为了简单起见,我建议您使用单个存储过程来更新并获取序列号,然后使用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)
)

最新更新