天天看點

資料庫中的萬聖節問題(Database "Halloween problem")

  今天在看《資料庫系統概念》這本書的查詢優化章節,在其中的第13.6.3節中提到了萬聖節問題(Halloween problem)。這是一個挺有意思的問題,不過現在已經不存在這樣的問題了,大多數資料庫管理系統都為我們解決了這樣的問題。不過我們可以來看看這個萬聖節問題到底是什麼。

  在1976年的萬聖節那一天,IBM的兩位程式要需要修改資料庫庫中内容,其所對應的業務内容是“給所有工資小于25000的員工加薪百分之十”,他們運作的sql語句如下:

  但是他們執行完這條語句以後發現了一個大問題,那就是資料庫中所有員工的工資都至少為25000。後來發現出現這樣的結果的主要問題是:所有工資小于25000的哪些記錄被無限次數得加薪了百分之十,直到工資大于等于25000為止。

然後執行工資增加10%的操作,在更新第一條記錄(1 張三 2000)以後,這三條記錄在資料庫中的存儲位置如下:

然後繼續更新第二條記錄(2 李四 2100),更新以後三條資料庫記錄的位置如下所示:

這一次我們需要再一次更新(1 張三 2200)這條記錄,那麼這一條記錄就更新了多次。這也是造成萬聖節問題的根本原因所在。

  如果更新不影響索引屬性,則萬聖節問題不會發生。即使影響索引屬性,如果更新減小該值,而索引掃描以升序執行,更新過的元素在掃描時不會再遇到。在這種情況下,查詢執行的同時可以更新索引。

  不過現在的資料庫管理系統基本解決了萬聖節問題,不會再出現上述情況,不過具體的解決方法是什麼,我還有待研究。

資料庫中的萬聖節問題(Database "Halloween problem")

然後我們執行一個加薪的sql,讓所有工資大于100的員工加薪10%,那麼假設存在萬聖節問題,那麼employeeID為7的員工可能會出現多次加薪,但是當我們執行下述sql以後,發現并沒有出現萬聖節問題:

進行加薪以後我們再次執行查詢語句,查詢結果如下:

資料庫中的萬聖節問題(Database "Halloween problem")

從上述查詢結果我們可以發現,每個員工都隻加工了一次。這也說明在現在的關系資料庫中,資料庫管理系統已經幫我們解決了萬聖節問題。

 本文轉自xwdreamer部落格園部落格,原文連結:http://www.cnblogs.com/xwdreamer/archive/2012/05/28/2522404.html,如需轉載請自行聯系原作者