2010-10-27 68 views

回答

4

只是:

UPDATE tabl 
SET  col1 = col2, 
     col2 = col1 

沒有DML查詢看到它的結果,以避免Halloween problem

在內部,UPDATE鎖被放置在記錄(或數據頁)上,舊的值被讀取並存儲到臨時變量,那麼鎖升級爲EXCLUSIVE和新值(存儲在臨時變量)是寫入適當的專欄。

+0

整齊!我從來不知道你可以指望這... – 2010-10-27 10:08:00

+0

只是出於興趣,你知道這是否工作,即使隔離級別設置爲未讀提交? – 2010-10-27 10:27:28

+0

@保羅:是的。儘管有'READ UNCOMMITED',DML查詢仍然會放置鎖。 – Quassnoi 2010-10-27 10:40:27

0

我的筆記信用喬·塞科:

<set clause list>每個任務並行執行和 每組第一次更改所有符合條件的行。或者至少是 這是理論模型。在實踐中,實現將首先使用WHERE 子句在一次傳遞中標記表中的所有限定行。如果沒有問題,那麼SQL引擎會在工作存儲中爲每個標記行創建一個 的副本。每個SET子句在舊行圖像上基於 執行,結果放入新行圖像。 最後,刪除舊行並插入新行。如果在所有這些過程中發生了一個 錯誤,則系統執行ROLLBACK,表 保持不變並報告錯誤。這種並行性不是 ,就像你在傳統的第三代編程 語言中找到的一樣,所以它可能很難學習。此功能可讓你寫一個 語句,將在兩列交換價值,即:

UPDATE MyTable 
SET a = b, b = a; 

這是不一樣的東西

BEGIN ATOMIC 
UPDATE MyTable 
SET a = b; 
UPDATE MyTable 
SET b = a; 
END; 

在第一次更新,列A和B交換每行中的值。在 第二對UPDATE中,列a將在每一行中獲得列b的所有值 。在該對的第二個UPDATE中,a(現在爲 與b的原始值具有相同的值)將被寫回 列b - 完全不變。對於值表達式可以有什麼限制。同一列在<set clause list>中不能出現超過一次 - 這是合理的,因爲該語句的並行性 。既然兩者都同時生效,你就不知道使用哪個SET子句。

相關問題