Navicat 部落格

關聯式資料庫交易中的物件鎖定 - 第 2 部分 2021 年 6 月 16 日,由 Robert Gravelle 撰寫

封閉式與開放式鎖定

關聯式資料庫系統(RDBMS)在修改(例如,更新或删除)資料表記錄時採用各種鎖定策略來強制執行交易 ACID 特性。有時,當兩個並行交易都在等待對方釋放鎖定而無法進行時,可能會發生死結。在本系列的第 1 部分中,我們知道了什麼是關聯式資料庫中的物件鎖定、不同類型的鎖定和死結。在本篇後續文章中,我們將比較封閉式和開放式鎖定的利弊。

封閉式鎖定

當使用封閉式鎖定時,從交易首次存取資源到交易完成,資源都會被鎖定,使其他交易在此期間無法存取該資源。在大多數交易只是讀取而不更新資源的情况下,獨佔鎖定可能會導致更多的鎖定競爭(死結)。回想一下第 1 部分中的銀行範例,一旦在交易中存取帳戶,它就會被鎖定。在帳戶被鎖定時,在其他交易中使用該帳戶的任何嘗試都會導致其他程序延遲,直到帳戶鎖定被釋放,或者程序交易將被取消並回溯到以前的狀態。

開放式鎖定

當使用開放式鎖定時,在交易第一次存取資源時,資源實際上不會被鎖定。相反,資源的初始狀態被保存。其他交易仍然能夠存取該資源,這使得衝突變更的可能性成為已知的風險。在認可交易時,當資源即將在永續性儲存中更新時,將再次從儲存中讀取資源的狀態,並將其與交易中首次存取資源時儲存的狀態進行比較。如果兩個狀態不同,則意味著進行了衝突更新,因此交易會被回溯。在我們的銀行範例中,帳戶的金額將在首次存取時儲存。如果交易更改了帳戶金額,則在即將更新金額之前,再次從儲存中讀取該金額。如果金額在交易開始後發生了變化,那麼交易本身將會失敗,否則新的金額將保留並被儲存。

在封閉式鎖定和開放式鎖定之間做出决定

既然我們已經介紹了這兩種類型的鎖定是什麼,問題就變成了應該使用哪種鎖定。在大多數情况下,開放式鎖定更有效,並提供更高的效能。與此同時,封閉式鎖提供了更好的資料完整性,但是,由於遇到死結的可能性更大,所以對鎖定的管理更困難。在選擇封閉式鎖定或開放式鎖定時,請考慮以下三條準則:

  • 如果有大量更新,並且使用者嘗試同時更新資料的可能性相對較高,則封閉式鎖定非常有用。
  • 封閉式鎖定在包含經常更新的小型資料表的應用程式中更合適。在這些「熱點」的情况下,發生衝突的可能性很高,以致開放式鎖定要浪費氣力回溯衝突交易。
  • 當發生衝突的可能性非常低時,開放式鎖定非常有用,即有許多記錄但使用者相對較少,或者更新很少並且主要是讀取作業。

總結

在這篇文章中,我們比較了封閉式鎖定和開放式鎖定。在下一篇中,我們將探討從死結狀態中復原的策略。



Rob Gravelle 居住於加拿大渥太華,是一名有 20 多年經驗的 IT 專家。過住,Rob 曾為情報相關的組織(如加拿大邊境服務局和各種商業組織)建置系統。在業餘時間,Rob 是一名出色的吉他演奏家,並擁有多張 CD和數位發行

Navicat 文章
頻道記錄
分享
部落格封存檔