一、請先說明資料庫管理系統為什麼需要做「並行控制」(Concurrency Control),並請定義並行控制所使用的「兩階段鎖定協定」(Two-Phase Locking Protocol)。(20 分)
詳解 (共 1 筆)
詳解
為什麼需要並行控制?
在資料庫管理系統(DBMS)中,並行控制是確保多個交易(transactions)能夠安全地並行執行的機制。其主要目的是避免並發執行帶來的問題,並保證資料庫的一致性和完整性。並行控制的重要性主要體現在以下幾個方面:
-
資料一致性(Data Consistency):
- 保證資料庫在多個交易並行執行後仍然處於一致的狀態。避免因為多個交易同時讀寫相同資料而導致的不一致情況。
-
隔離性(Isolation):
- 每個交易在執行過程中不受其他交易的影響,模擬一個獨佔使用資料庫的環境。這樣可以避免「髒讀」(dirty read)、「不可重複讀」(non-repeatable read)和「幻影讀」(phantom read)等問題。
-
避免死鎖(Deadlock)和資源競爭:
- 有效的並行控制機制可以減少或避免死鎖情況的發生,並優化資源使用,提升系統性能。
-
提高性能(Performance):
- 合理的並行控制允許多個交易並行執行,從而提高系統的吞吐量和資源利用率。
兩階段鎖定協定(Two-Phase Locking Protocol)
兩階段鎖定協定(Two-Phase Locking Protocol, 2PL)是一種常見的並行控制機制,用於保證交易的隔離性和資料庫的一致性。該協定將鎖定操作分為兩個階段:擴展階段(Growing Phase)和收縮階段(Shrinking Phase)。
定義:
-
擴展階段(Growing Phase):
- 在擴展階段,交易可以申請鎖(lock)並獲取所需的所有鎖,但不能釋放任何鎖。
- 當交易需要讀取或寫入某個資料項時,會申請相應的共享鎖(shared lock)或排他鎖(exclusive lock)。
-
收縮階段(Shrinking Phase):
- 一旦交易釋放了第一個鎖,就進入了收縮階段。在收縮階段,交易只能釋放鎖,不能再申請任何新的鎖。
操作步驟:
-
交易開始:
- 交易開始執行,進入擴展階段,申請所需的鎖。
-
鎖的申請和獲取:
- 交易在執行過程中,不斷申請和獲取所需的共享鎖或排他鎖。
-
進入收縮階段:
- 當交易釋放了第一個鎖,進入收縮階段,此時不能再申請新的鎖。
-
釋放所有鎖:
- 交易完成所有操作後,釋放所有持有的鎖,結束交易。
優點:
- 避免資料不一致:2PL保證了所有的讀寫操作在交易內是互斥的,避免了資料不一致的問題。
- 確保隔離性:通過鎖定機制,2PL能有效確保交易的隔離性。
缺點:
- 可能導致死鎖:如果多個交易互相等待對方釋放鎖,可能會導致死鎖。
- 性能影響:過多的鎖操作和等待可能會影響系統的性能。
範例
假設有兩個交易 T1T1T1 和 T2T2T2,它們分別需要讀寫資料庫中的資源 A 和 B。
- 交易 T1T1T1 先申請 A 的排他鎖,然後申請 B 的排他鎖。
- 交易 T2T2T2 先申請 B 的排他鎖,然後申請 A 的排他鎖。
如果 T1T1T1 已經獲得了 A 的鎖,且 T2T2T2 已經獲得了 B 的鎖,這時就會出現死鎖現象,因為 T1T1T1 和 T2T2T2 都在等待對方釋放鎖,無法繼續執行。
在實現中,可以使用死鎖檢測機制來解決這個問題,例如定期檢查鎖等待圖(wait-for graph)來檢測和處理死鎖。
並行控制在資料庫管理系統中至關重要,用於保證多個交易並行執行時的資料一致性和隔離性。兩階段鎖定協定(2PL)是實現並行控制的一種常見方法,通過擴展階段和收縮階段的鎖操作來保證交易的正確性和一致性。雖然2PL可能會導致死鎖和性能問題,但它在確保資料庫完整性和交易隔離性方面具有重要作用。