我正在做一个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)
)