《Oracle資料庫管理與維護實戰》 2 9 鎖

2021-09-23 16:27:30 字數 3608 閱讀 4557

oracle資料庫管理與維護實戰

為阻止併發事務對資料的一致性破壞,oracle在系統中鎖定不同的資料庫資源。資料庫鎖防止影響另外一些人使用資料庫。

鎖可分為自動鎖和顯示鎖,當進行資料庫操作時,預設情況下,乙個事務會自動獲得所有資料庫資源所需要的鎖。例如,假設開始一項新事務,要更新乙個客戶的位址,在更新需要的記錄行之前,oracle進行檢查,確定有沒有其他事務鎖定這行記錄。如果有其他事務鎖定這條記錄,oracle則等待,直到其他事務釋放了該記錄的鎖;如果沒有其他記錄鎖定該記錄,則自動為該記錄上鎖,到該事務提交或回滾這個事務時才釋放該鎖。

oracle的預設鎖機制對大多數應用而言已經足夠。但也有一些情況下,事務需要顯示的鎖定資料庫操作需要用到的資料。例如,如果要對錶中大多數記錄行進行更新,而表又很大,那麼對整個表鎖定比對一行記錄鎖定更有效。而且,對錶進行鎖定可以保證對錶更新一次完成,中間不需要有鎖等待。

oracle的鎖根據物件的級別可以分為表級鎖、行級鎖等。

通常,oracle有兩種鎖鎖定資料資源:共享鎖和排他鎖。圖2-30顯示了共享鎖和排他鎖的使用。

1.共享鎖

資料庫資源的共享鎖給予乙個事務對特定鎖資源的共享訪問,同時另一事務也可以獲得同一資源的共享鎖。例如圖2-30中,兩個事務都具有同一表的共享鎖,這就允許不同事務在同一時間更新同一表中不同的記錄行。

共享鎖允許事務高度併發性,又稱共享鎖為寫鎖。然而,事務不能總是為所有型別的資源與操作獲得共享鎖。例如,圖2-30中雖然每個事務都可以同時獲得同乙個表的共享鎖,但該事務對它所更新的行獲得排他鎖,使其他事務不能更新相同的行,以保護資料安全。

2.排他鎖

排他鎖不同於共享鎖的是,排他鎖在鎖定了某資源後,不允許其他事務獲取該資源,例如圖2-30中,事務1獲得第1行與第2行的排他鎖後,另一事務2不可以在事務1提交或回滾前獲得相同行的共享鎖或排他鎖。

排他鎖顯然比共享鎖更嚴格,排他鎖又叫寫鎖,併發性程度更低。因而,oracle不自動獲取資料庫資源的排他鎖,除非個別需要使用,如需阻止其他併發事件的破壞**互。

當事務進行dml操作(insert、update、delete)時,oracle自動獲得資料庫中表與索引的鎖。為提高併發性並且防止破壞資料,在dml執行過程中,oracle可以同時獲得行級鎖和表級鎖。

1.行級鎖

當事務插入、更新、刪除行時,該事務自動獲得該特定行的排他鎖。在行級鎖鎖資料行期間,其他事務不可以對該行更新、刪除或修改。舉乙個例子,當事務中含有以下語句時,oracle將自動鎖定customers表中的行。

sql>update sales.customers

set….

where last_name=』ellison』 and first_name = 『lawrence』;

如果其他事務在以上事務提交或回滾之前,想更新customers表中的larry ellison的記錄,oracle發現該行已被鎖定,就會讓後來的事務處於等待狀態。

在更新記錄之前,事務可以使用select…for update語句先行鎖定要更新的記錄。例如,以下語句將所有的zipcode為95000的記錄鎖定。

sql>select * from sales.customers

where zipcode=95000

for update

nowait;

當執行以上語句時,如果不能鎖定所有滿足條件的記錄,oracle會返回控制。如果沒有nowait關鍵字,select…for update語句就會一直處於等待狀態,直到獲得所有的記錄行。

2.表級鎖

當事務獲得一條記錄上的鎖時,事務自動獲得含該行的表的鎖。當事務更新表中一行或多行時,可以使用表級鎖,以防止其他ddl操作破壞表更新。

例如,要更新customers表中的一行時,事務獲得更新行的排他鎖,同時也獲得customers的表級鎖,將表鎖定以防止其他事務修改或刪除表。

事務可以在事務進行過程中獲得表上的共享鎖或排他鎖。當事務執行一條基本的dml操作,如insert、update或delete時,事務通常給共享鎖,但也可以使用排他鎖。這時需要用lock table在表中顯示的指定。例如以下語句就用lock table語句獲得customers的排他鎖。

sql>lock table customers

in exclusive mode

nowait;

如果oracle不能立即獲得所需要的表級鎖,nowait會將控制返回,告知不能立即獲得表級鎖。如果沒有nowait,事務將一直處於等待狀態,直到獲得表級鎖。

oracle實際上還有幾種不同級別的表級鎖,這裡不再詳細介紹,包括行共享、行排他、共享行排他以及排他級別,每個表級鎖都比前乙個嚴格。

3.死鎖

死鎖是oracle系統應當盡量避免的情形,它是因為資源共享而引起的。產生的原因是兩個或多個事務等待需要的某個資源,而又不釋放現有的資源。圖2-31示意的是死鎖發生的 過程。

圖2-31中,事務1在表的row #1有乙個排他鎖並等待事務2釋放#2的排他鎖,但同時#2具有#1需要的排他鎖並且在等待#1釋放鎖。因而兩個事務一直僵持,如果沒有外來干預,兩個事務將永遠僵持下去。

死鎖的發生是因為不合理的設計。例如,以下兩個事務,每個事務含有對parts表的多個更新,結果處於死鎖狀態,因為它們各自鎖定了另乙個事務需要的行,如表2-7所示。

上述事務的設計容易引起死鎖,當事務1和事務2同時執行時,事務1需要鎖定id=2的行,而事務2將id=2的行已先行鎖定,事務1只能等待事務2釋放鎖;而事務2又在等待事務1的鎖,兩個事務進入死迴圈。我們可以對錶2-7加以改進,避免死鎖,如表2-8所示。

上述表對事務設計進行了改進,在每乙個update語句後面都加commit語句,以及時提交並釋放行級鎖,這樣避免了死鎖。oracle在執行過程中會自動檢測死鎖,並回滾產生死鎖的語句以消除死鎖。

前面解釋了oracle自動用於保護dml操作的鎖。但在使用create、alter與drop語句時,oracle也會自動鎖定資料。每個ddl操作在它自己的事務中完成,只有在進行ddl操作期間才會使用ddl鎖。

1.排他ddl鎖

建立、修改或刪除資料庫物件的ddl語句需要對目標物件使用排他鎖。例如,當執行乙個alter table語句時,要給表増加完整性約束,事務會自動給表加排他鎖。在alter語句前,其他使用者不能修改或刪除該錶。

2.共享ddl鎖

一些ddl語句可以獲得資料庫物件的共享ddl鎖,在資料庫物件之間建立相互依賴關係的ddl語句通常需要共享ddl鎖。例如,建立包時,包的過程與函式引用許多不同的資料庫表:當建立這個包時,事務獲得這個包上的排他ddl鎖,同時獲得所引用鎖的共享ddl鎖,這個共享ddl鎖阻止另乙個事務獲得所引用表的排他鎖,而且防止oracle在完成包編譯前修改或刪除包所引用的表。和dml共享鎖一樣,ddl共享鎖不妨礙另乙個事務獲得同一表的共享ddl鎖。

六 資料庫管理與維護

維護工作包括 資料庫轉儲與恢復 資料庫安全性 完整性控制 檢測並改善資料庫效能 資料庫的重組與重構 1 重組不修改資料庫原有的邏輯結構和物理結構 2 重構部分修改模式和內模式 一 資料庫完整性 完整性設計 保證資料來源的正確性 一致性和相容性 資料完整性約束的作用物件分為列 元祖和關係三種級別。二 ...

Oracle資料庫web維護管理及監控

1 oracle資料庫客戶端的種類及現狀 目前oracle資料庫維護管理,通常是使用客戶端軟體 pl sql developer,sql plus,toad,em等進行資料的管理 維護等操作。這些工具大都是與oracle一起 安裝的,基於c s模式連線,基於命令列方式操作,不易用,並且安裝過程繁瑣等...

從實踐中學習Oracle資料庫管理與維護

本書是作者二十多年it工作經驗和教學實踐的總結與昇華,是 oracle 資料庫管理的 入門教材,適合於初 中級讀者。本著 把0racle資料庫從高雅的象牙塔中帶出來,使它的 貴族 身份 平民 化,為讀者提供一套能買得起 並且容易讀懂的oracle資料庫實用教材 的寫作理念,本書使用生動而簡單的生活例...