資料庫基礎
庫存表格中某商品的庫存數為10。交易T1讀出庫存數後寫入減3的值,T2讀出庫存數後寫入減5的值。若不加鎖,依T1讀取、T2讀取、T1寫入、T2寫入的順序執行,最後的庫存數為多少?
- A2
- B5
- C7
查看答案與解析
正確答案:B. 5
T1與T2都在對方寫入之前讀出庫存數10。T1寫入 10 − 3 = 7,但之後T2以自己讀出的10計算出的 10 − 5 = 5 覆寫,因此最後的庫存數為5。原本應該是依序進行兩項處理的 10 − 3 − 5 = 2,T1的更新遺失了。這稱為遺失更新(Lost update)。要防止這個問題,可在讀取時加上排他鎖,讓T2的讀取等到T1結束(如 SELECT … FOR UPDATE),或像 UPDATE 庫存 SET 庫存數 = 庫存數 - 3 這樣,以一個SQL敘述完成讀取與寫入。
- A. 這是依序執行兩項處理時的正確值,但在這個順序下T1的更新會遺失。
- B. 正確。T2以舊值10計算出的5覆寫,T1的更新遺失。
- C. 這是T1寫入的值,之後被T2覆寫。