Oracle 和 DB2,比較和相容性/流程模型
華夏公益教科書關於 架構 的部分涵蓋了 Oracle 和 DB2 使用的各種邏輯和物理儲存結構。本節介紹了這些 DBMS 如何在這些結構上執行常見的資料庫操作。有許多概念是資料庫操作的基礎,其中最重要的概念是事務的概念。
事務。
事務是 DBMS 中邏輯工作單元。它是資料庫對一組資料執行的操作(例如插入、選擇、更新和刪除)以及資料本身的組合。事務的目的是提供資料庫上所有操作之間的隔離 - 事務基本上說“我正在處理這組資料,在我完成之前,我將控制對它的訪問”。這也為 DBMS 提供了一種機制來維護資料庫的一致性 - 事務中的所有操作要麼一起工作,要麼一起失敗,並且在最後,資料庫將處於已知的一致狀態。隔離和一致性是定義資料庫事務的兩個屬性。其他屬性是原子性和永續性 - 這些概念統稱為 ACID。
ACID
所有資料庫,無論供應商如何,通常都必須處理大量併發使用者和可能包含許多離散步驟的複雜操作 - 每個步驟都可能成功或失敗。無論操作是單個步驟還是多個步驟,它都由稱為事務的邏輯單元描述。此要求非常普遍,以至於它已被制定為一組屬性,透過這些屬性可以評估 DBMS(或實際上任何事務系統)。一旦您瞭解資料庫如何實現這些屬性,您就可以看到它們如何保證事務可靠性。重要的是要強調,雖然事務需要可靠地處理,但這並不意味著每個 DBMS(即使來自同一供應商的資料庫)以完全相同的方式處理這些事務。可靠性意味著,一旦您知道資料庫如何處理事務,您就可以確保它始終以這種方式執行。
縮寫 ACID 代表原子性、一致性、隔離性和永續性,這些屬性用於評估 DBMS 是否可靠地處理事務。它們由 Jim Gray 在 1970 年代定義,1983 年 Andreas Reuter 和 Theo Haerder 創造了縮寫 ACID 來描述它們。根據定義,資料庫事務必須是 ACID。
原子性。
事務或事務中步驟可能失敗的原因有很多。原子性屬性指出,事務不能細分,並且無論事務中可能有多少個步驟,它們要麼全部工作,要麼全部失敗。
一致性。
在事務結束時,資料庫需要處於一致狀態。一個例子是,如果一個欄位被定義為整數,則可以透過拒絕十進位制數或將它們舍入到整數來維護此欄位的一致性 - 兩者都將欄位保持在一致狀態。另一個例子是欄位間依賴關係,其中一行中的一個欄位依賴於另一行中的一個欄位。這稱為參照完整性,並且在更改這些欄位之一時,有很多選項可以維護資料庫的一致性。例如,如果您嘗試刪除另一個行引用的行,您可以停止事務並將其回滾(原子性)、刪除該行以及所有引用它的其他行,或者將引用您要刪除的行的一行中的欄位設定為預定義的值(即 NULL)。
隔離。
除了最原始的計算機操作之外,所有操作都涉及許多步驟,在多使用者系統中,重要的是要確保一個使用者對一組資料執行的操作不會被另一個使用者在它們下面更改該資料。在這種情況下,我們在我們需要執行的所有步驟周圍設定一個邏輯邊界,並將其稱為事務。隔離是保護此操作中涉及的資料的機制。在最簡單的級別,我們可以在事務持續時間內禁止訪問此資料。透過諸如死鎖(程序 a 擁有程序 b 需要資源,而程序 b 擁有程序 a 需要的資料 - 這就是所謂的致命擁抱),以及簡單地鎖定資料會降低併發性 - 鎖定使用者會違背擁有多使用者系統的目的。隔離通常是 ACID 屬性中最寬鬆的,並且有很多策略可以處理這個問題。
持久。
資料庫不能丟失任何資料,包括事務,這個屬性被稱為永續性。Oracle 和 DB2 透過將事務寫入日誌檔案並採取特殊措施來確保這些日誌檔案受到保護(包括將事務同時寫入不同磁碟上的不同日誌檔案,然後將這些日誌檔案備份到永久離線儲存中)來實現永續性。
總結。
資料庫絕對不能損壞或丟失資料,上面概述的 ACID 屬性是透過鎖定、日誌記錄和事務控制等技術實現的(每個都將在以下部分中介紹)。另一個要求是它們要快。
在您對資料編寫任何程式碼之前,DBMS 已經實現了這些要求中的每一個,並且在許多情況下,即使在來自同一供應商的資料庫之間,實現也可能不同。以下部分介紹了 Oracle 和 DB2 的這些操作方面。