SQL Server自定义增长序列生成

时间:2014-07-10 12:18:31

标签: sql sql-server concurrency triggers

假设我有一个这样的表。

CREATE TABLE t
(
  id int IDENTITY(1,1) NOT NULL,
  condition int NOT NULL, 
  result int NULL
)

根据condition值,我在插入触发器后生成result。我对当前条件采用max result并递增它。

CREATE TRIGGER [t_Trigger]
ON t
AFTER INSERT
AS
BEGIN
  IF (SELECT COUNT(DISTINCT condition) FROM INSERTED) > 1
    BEGIN
      RAISERROR('Cannot insert records with more than one condition simultaneously', 16, 2)
      ROLLBACK TRAN
      RETURN
    END

  DECLARE @cond int;
  DECLARE @maxResult int;
  SET @cond = (SELECT TOP(1) condition FROM INSERTED);
  SET @maxResult = (SELECT MAX(result) FROM t WHERE condition = @cond);

  UPDATE t
  SET @maxResult = t.result = ISNULL(@maxResult, 0) + 1
  FROM t as t
  JOIN INSERTED i
    ON t.id = i.id;    
END

任务是在每次插入后为每个result值在condition中生成一个不断增长的序列。

我的问题是线程安全。如果两个或多个会话将多个记录插入t,则可能会为同一个result显示重复的condition个值吗?怎么避免呢?

现在我有一个变种来在我的配置表中创建一个记录,用于为每个条件存储当前max(result)的xml记录。像这样:

<MaxResults>
  <Condition value="1">5</Condition>
  <Condition value="2">7</Condition>
  ...
</MaxResults>

所以在t_Trigger中,我获取当前条件的maxResult,更新t并更新配置记录。但同样的问题出现在线程安全的xml访问等。

0 个答案:

没有答案