什麼是交易

把對資料庫的一連串處理合併為一個單位來處理者。以COMMIT確定處理結果,以ROLLBACK回到開始前的狀態。DBMS利用鎖與日誌加以管理,使其滿足原子性、一致性、隔離性與持久性(ACID特性)。

日文名稱: トランザクション

「交易」出現在1領域的13道練習題中(資料庫基礎等)。

這個名詞所屬的領域: 資料庫基礎

COMMIT與ROLLBACK

在銀行轉帳中,從帳戶A扣款與存入帳戶B兩項處理都完成,結果才正確。交易把這樣的一連串處理合併為一個單位,最後執行COMMIT時結果確定,途中發生錯誤等情況時執行ROLLBACK,交易中的所有修改都會被取消。尚未COMMIT的修改在發生故障時也會被取消,不會留下只反映部分修改的不完整狀態。

並行控制

許多使用者同時使用資料庫時,多筆交易會讀寫相同的資料。若不加控制,就會發生一方的修改被另一方覆寫而遺失(遺失修改,Lost update)、讀取到尚未提交的資料(髒讀)等問題。DBMS利用使用共享鎖與排他鎖的並行控制,或保留修改前的版本供讀取使用的多版本並行控制(MVCC)等,防止交易之間的干擾。要防止到什麼程度,則以隔離等級來選擇。

從故障中復原

DBMS把修改前後的值記錄在日誌中,並在寫入資料庫本體之前先把日誌寫入儲存裝置。發生故障後,依據日誌重做已提交之交易的修改(前滾),並取消未提交之交易的修改(回復),回到正確的狀態。定期取檢查點,可以縮短復原時要追溯的日誌範圍。

練習交易的題目

在帳戶表格中開始一筆交易,執行從帳戶A的餘額減去300的UPDATE,以及在帳戶B的餘額加上300的UPDATE。之後執行ROLLBACK而非COMMIT。帳戶表格會變成怎樣?

  1. A只有對帳戶B的加算被取消,帳戶A的減算保留
  2. B兩個UPDATE都被取消,回到交易開始前的狀態
  3. CUPDATE已經執行,因此兩者都不會被取消
查看答案與解析

正確答案:B. 兩個UPDATE都被取消,回到交易開始前的狀態

交易是把對資料庫的一連串處理合併為一個單位來處理的機制。在交易中進行的更新,執行COMMIT後就會確定,執行ROLLBACK則全部取消,回到交易開始前的狀態。在這個例子中,帳戶A的減算與帳戶B的加算都會被取消,兩個帳戶的餘額維持原狀。轉帳途中發生錯誤時執行ROLLBACK,就不會留下只更新了一個帳戶的不完整狀態。若只想取消一部分,也可以用SAVEPOINT在中途做記號,再以 ROLLBACK TO SAVEPOINT 回到該處。

在交易應具備的ACID特性中,「從帳戶A扣款並存入帳戶B的轉帳處理,即使途中發生故障,也只會是兩者都完成或完全不進行」的性質是下列何者?

  1. A一致性(Consistency)
  2. B持久性(Durability)
  3. C原子性(Atomicity)
查看答案與解析

正確答案:C. 原子性(Atomicity)

ACID特性取自交易應滿足之4項性質的字首。原子性(Atomicity)是交易中的處理要不全部執行、要不完全不執行的性質,發生故障時會取消執行到一半的更新。一致性(Consistency)是交易前後資料持續滿足完整性限制(餘額不為負、外鍵的參照對象存在等)的性質。隔離性(Isolation)是同時執行的多筆交易彼此不干擾,結果與逐一依序執行時相同的性質。持久性(Durability)是已提交之交易的結果,即使之後發生故障也不會遺失的性質。題目中「全有或全無」的性質是原子性。

常見問題

交易進行到一半發生錯誤時會怎樣?

由應用程式執行ROLLBACK,或由DBMS進行故障復原處理,該交易中的所有修改都會被取消,不會只留下部分修改。

交易拉得太長會有什麼問題?

會長時間持有鎖,使其他交易必須等待,能同時處理的量減少,也更容易發生死結。基本上,交易應在維持一致性所需的範圍內盡量縮短。

解析中的「交易」

出現「交易」的題目(13題)

  1. 在帳戶表格中開始一筆交易,執行從帳戶A的餘額減去300的UPDATE,以及在帳戶B的餘額加上300的UPDATE。之後執行ROLLBACK而非COMMIT。帳戶表格會變成怎樣?
  2. 在交易應具備的ACID特性中,「從帳戶A扣款並存入帳戶B的轉帳處理,即使途中發生故障,也只會是兩者都完成或完全不進行」的性質是下列何者?
  3. 庫存表格中某商品的庫存數為10。交易T1讀出庫存數後寫入減3的值,T2讀出庫存數後寫入減5的值。若不加鎖,依T1讀取、T2讀取、T1寫入、T2寫入的順序執行,最後的庫存數為多少?
  4. 在同時執行交易時發生的問題中,下列何者正確說明了髒讀(Dirty read)?
  5. 交易T1執行 SELECT COUNT(*) FROM 訂單 WHERE 金額 >= 1000,結果為8筆。緊接著T2以INSERT新增一筆金額2000的訂單並提交。T1再次執行相同的SELECT敘述,結果變為9筆。這個現象是下列何者?
  6. 交易T1對某筆資料列加上共享鎖並正在讀取。T2對這筆資料列要求共享鎖,T3要求排他鎖。在T1解除鎖之前的期間,下列何者正確?
  7. 關於交易的並行控制所使用的兩階段鎖定(2PL),下列敘述何者正確?
  8. 交易T1對資料列A加上排他鎖後要求資料列B的鎖,T2對資料列B加上排他鎖後要求資料列A的鎖,結果兩者都無法繼續。DBMS偵測到這個狀態時,一般的處理方式是下列何者?
  9. 有交易T1~T5,在發生故障前取了一次檢查點。T1在檢查點之前開始並提交。T2與T3在檢查點之前開始,T2在檢查點之後、故障之前提交,T3在故障時尚未提交。T4與T5在檢查點之後開始,T4在故障前提交,T5尚未提交。故障後的復原中,需要使用日誌進行前滾(Rollforward)的交易是下列何者?
  10. SQL敘述可分為資料定義語言(DDL)、資料操作語言(DML)與資料控制語言(DCL)。屬於DDL的是下列何者?
  11. 在SQL中不加WHERE子句執行 DELETE FROM 員工,結果何者正確?
  12. 在SQL標準規格所定義的隔離等級中,關於READ COMMITTED下可能發生之現象的組合,下列何者正確?
  13. 許多DBMS在更新資料時,會把更新內容記錄在日誌中,並在寫入資料庫本體之前,先把日誌寫入非揮發性儲存裝置(WAL:預寫式日誌)。採用此方式的主要理由是下列何者?

相關名詞

SQL 隔離等級 ACID特性 死結(Deadlock) 外鍵 兩階段鎖定(2PL) 檢視表 索引 主鍵 正規化

前往名詞解釋列表