在“T-SQL Fundamentals”一书中,对于下面带有“赋值”查询的“更新”,作者说:
专门的UPDATE语法作为事务运行,而且更多 比使用单独的UPDATE和SELECT语句更有效 仅访问一次数据。请注意,变量赋值不是 但是,事务性的。
CREATE TABLE dbo.MySequences
(
id VARCHAR(10) NOT NULL CONSTRAINT PK_MySequences PRIMARY KEY(id),
val INT NOT NULL
);
INSERT INTO dbo.MySequences VALUES('SEQ1', 0);
DECLARE @nextval AS INT;
UPDATE dbo.MySequences
SET @nextval = val += 1
WHERE id = 'SEQ1';
SELECT @nextval AS nextValue;
我对为什么“UPDATE”语句作为事务运行有点困惑,但变量赋值(即SET @nextval = val +
= 1)不是事务性的?不是“UPDATE”语句的变量赋值部分吗?
有人可以澄清这个概念吗?
答案 0 :(得分:1)
它不能是交易性的,因为it's recursive update
。但每次递归运行都是在隐式事务中进行的。
这意味着我的变量更新第一行,并添加到我的变量旧值+1,然后第二次运行更新第二行,添加到我的变量旧值+1 ...
如果您希望原子解决方案使用rownumber或Sequency。如果您想使用事务use explicit transaction
。