2016-12-01 46 views
1

在这本书中的“T-SQL基础”,对于“UPDATE”与“转让”的查询中,笔者指出:为什么在UPDATE语句中赋值变量不是事务性的?

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

有人能澄清这个概念吗?

+3

数据库的ACID属性适用于表格,而不适用于标量变量。 –

+0

非常感谢您的评论。所以我只是想知道,如果“UPDATE”事务失败会发生什么情况,失败将如何影响“SELECT @nextval AS nextValue”?再次感谢你的帮助! – Thor

+1

如果这是实际的代码(而不仅仅是一个问题的样本),我建议使用一个实际的序列(在SQL 2012中引入)。或者至少是身份价值。你现在得到的东西很可能有问题...... –

回答

1

它不能交易,因为it's recursive update。但是每个递归运行都是隐式事务。

它通过我的变量是指更新第一行,并添加到我的变量旧值+1,然后第二次运行更新第二行,添加到我的变量旧值+1 ...

如果您想原子解决方案使用rownumber或sequent。如果您想使用交易use explicit transaction

相关问题