为什么在UPDATE语句中赋值变量不是事务性的?

时间:2016-12-01 03:50:08

标签: sql-server tsql

在“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”语句的变量赋值部分吗?

有人可以澄清这个概念吗?

1 个答案:

答案 0 :(得分:1)

它不能是交易性的,因为it's recursive update。但每次递归运行都是在隐式事务中进行的。

这意味着我的变量更新第一行,并添加到我的变量旧值+1,然后第二次运行更新第二行,添加到我的变量旧值+1 ...

如果您希望原子解决方案使用rownumber或Sequency。如果您想使用事务use explicit transaction