假设我有一个这样的表。
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访问等。