跳轉到內容

Oracle 和 DB2,比較與相容性/程序模型/鎖定/Oracle

來自 Wikibooks,開放世界中的開放書籍

在最高級別,Oracle 以這種方式執行 - 閱讀者不會阻塞閱讀者。如果您正在讀取資料,則無需等待其他正在讀取相同資料的人。寫入者不會阻塞閱讀者 - 如果您正在讀取資料,則無需等待正在寫入同一塊的使用者。寫入者只會阻塞其他正在寫入同一塊的寫入者。

Oracle 中稱為 SERIALIZABLE 的隔離級別實際上是快照隔離。快照隔離透過獲取資料的“快照”來工作 - 稱為讀一致資料映像。所有讀取都看到此快照,並且事務只有在它所做的任何更新與自該快照以來所做的任何併發更新沒有衝突時才會成功提交。

由於 Oracle 不保證某些事務的序列排序會導致相同的結果,因此這與 ANSI/ISO 標準直接矛盾。使用它的原因是它的效能比可序列化更好,並且避免了併發異常。快照隔離與多版本併發控制 (MVCC) 密切相關。

Oracle 的鎖定機制與其事務控制緊密耦合。其想法是,如果您正確設計了事務,則不必擔心鎖定,因為 DBMS 會自動為您獲取鎖定。話雖如此,Oracle 確實允許使用者在需要時手動獲取鎖定。Oracle 鎖定適用於使用者物件(表和行)和使用者不可見的系統物件(記憶體中的共享資料結構和資料字典行)。Oracle 嘗試在儘可能低的級別獲取鎖定以確保高水平的資料併發。

Oracle 有兩個級別的鎖定,獨佔和共享。獨佔鎖定用於修改資料。第一個獲得獨佔鎖的事務是唯一可以更改該物件的事務,直到鎖被釋放。共享鎖定允許鎖定物件被共享(取決於所涉及的操作)。多個使用者讀取資料可以透過持有共享鎖來共享資料,這將阻止寫入者訪問相同資料,因為它需要獨佔鎖。

在一個事務中獲取的所有鎖都將在事務持續期間保持,以防止諸如髒讀、丟失更新和破壞性 DDL 操作(即,一個事務在另一個事務嘗試插入時刪除表)之類的事情。由一個事務所做的更改只對在第一個事務提交後開始的其他事務可見(讀一致資料映像)。

Oracle 在提交或事務回滾(撤消)時釋放鎖。在回滾到先前儲存點時也會釋放鎖。在回滾到儲存點時,只有不在等待先前鎖定資源的事務才能在新的可用資源上獲得鎖。在事務開始時等待的事務會回滾到一個儲存點,它將繼續等待,直到原始事務完全提交或回滾。

對在事務中插入、更新或刪除的所有行獲取獨佔行鎖。行鎖在最高限制級別獲取,因此在獲取行鎖後不需要轉換行鎖。但是,Oracle 可以轉換表鎖。帶有 FOR UPDATE 子句的 SELECT 語句將獲取獨佔行鎖和表的行共享表鎖。如果事務後來更新了一個或多個鎖定的行,則行共享表鎖將自動轉換為行獨佔表鎖。這是一個鎖定轉換的例子。

Oracle 從不升級鎖定。鎖定升級發生在資料庫需要將在一個粒度級別(例如行)持有的鎖定提升到更高級別(例如表)時。一個例子是,如果使用者在一個表中有幾個行鎖,而資料庫將使用者的行鎖提升到表鎖。這減少了鎖定的數量,但增加了被鎖定內容的限制性,因此死鎖的可能性也增加了。

華夏公益教科書