資料庫基礎

庫存表格中某商品的庫存數為10。交易T1讀出庫存數後寫入減3的值,T2讀出庫存數後寫入減5的值。若不加鎖,依T1讀取、T2讀取、T1寫入、T2寫入的順序執行,最後的庫存數為多少?

  1. A2
  2. B5
  3. 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覆寫。
練習這個領域 前往領域頁面

相關計算工具

資料庫基礎的其他題目

  1. 在同時執行交易時發生的問題中,下列何者正確說明了髒讀(Dirty read)?
  2. 交易T1執行 SELECT COUNT(*) FROM 訂單 WHERE 金額 >= 1000,結果為8筆。緊接著T2以INSERT新增一筆金額2000的訂單並提交。T1再次執行相同的SELECT敘述,結果變為9筆。這個現象是下列何者?
  3. 在SQL標準規格所定義的隔離等級中,關於READ COMMITTED下可能發生之現象的組合,下列何者正確?
  4. 交易T1對某筆資料列加上共享鎖並正在讀取。T2對這筆資料列要求共享鎖,T3要求排他鎖。在T1解除鎖之前的期間,下列何者正確?
  5. 關於交易的並行控制所使用的兩階段鎖定(2PL),下列敘述何者正確?