2016-12-01 23 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

相關問題