2010-06-07 122 views
2

我想執行更新,然後選擇結果。我不希望任何東西能夠更新我要更新的行,直到選擇發生之後。我將如何做到這一點?SQL Server 2005和SELECT和UPDATE鎖定

我的目標是增加一行的值並返回增加的值。到目前爲止,我發現我最終遇到了一個問題,即更新(增加),然後在選擇似乎返回相同數字的同一時間發生兩個查詢的情況下進行選擇。所以我猜測,更新>更新>選擇>選擇正在發生。

我錯過了將其標記爲SQL Server 2005.我實際上使用Server 2000.所以輸出子句不起作用(不在該版本中)。

BEGIN TRANSACTION 
UPDATE Table SET Last=(Last+1) WHERE ID=someid; 
SELECT * FROM Table WHERE ID=someid; 
COMMIT TRANSACTION 
+0

你絕對沒有在選擇獲取更新中使用的值的select [select> update> select'? – 2010-06-08 17:39:37

+0

我正在添加調試以查找確切值,我知道它們是相同的。 – aepheus 2010-06-08 17:42:53

+0

你能發佈代碼嗎? – 2010-06-08 17:43:46

回答

3
BEGIN TRAN 
UPDATE ... 
SELECT... 
COMMIT 

甚至應該在提交讀的默認事務隔離級別做到這一點。

您也可以使用OUTPUT子句在更新後直接返回該行。這樣的例子:

UPDATE <YourTable> 
    SET ... 
OUTPUT INSERTED.* 
WHERE ... 
+0

謝謝,開始/提交正是我一直在尋找。 – aepheus 2010-06-07 22:39:16

+0

爲了完整起見,我應該提到,如果where子句不保證是唯一的,並且您希望確保您的選擇不會返回更新後插入的任何附加行,這些行與您需要的where子句相匹配使用SERIALIZABLE隔離級別。 – 2010-06-07 23:03:55

+0

這似乎並沒有像我預料的那樣工作。今天上午測試似乎表明,更新和選擇仍然存在問題。看起來像兩個「更新然後選擇」調用可以進來,發生這樣的事情:更新>更新>選擇>選擇。如果兩個選項的結果都是相同的值,那麼它們應該具有不同的值。注意:這一切都在同一行。 – aepheus 2010-06-08 17:10:43