資料庫中級教程:第十一講 資料庫的各種鎖
資料庫的效能的問題,有一大部分是與鎖相關的。對於dba,必須清楚地了解資料庫
的鎖機制。
資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就
會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和存
儲不正確的資料,破壞資料庫的一致性。
如果是單使用者的系統,那完全沒有必要這個鎖,就是因為有多使用者併發操作,我們為
了確保資源的安全性(也就是oracle的資料完整性和一致性)才引申出這個鎖出來。
oracle 利用其鎖機制來實現事務間的資料併發訪問及資料一致性。
加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行
操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料物件有了一定的控制,
在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。
oracle的鎖機制是一種輕量級的鎖定機制,不是通過構建鎖列表來進行資料的鎖定
管理,而是直接將鎖作為資料塊的屬性,儲存在資料塊首部。
在 oracle 資料庫中,它並不是對某個表加上鎖或者某幾行加上鎖, 鎖是以資料塊
的乙個屬性存在的。 也就是說, 每個資料塊本身就儲存著自己資料塊中資料的資訊,
這個地方叫 itl( interested transaction list), 凡是在這個資料塊上有活動的
事務,它的資訊就會記錄在這裡面供後續的操作查詢,一保證事務的一致性。
在oracle資料庫中,不存在真正意義上屬於某個物件或資料的鎖。oracle鎖的資訊是
資料塊的乙個物理屬性,而不是邏輯上屬於某個表或某個行。
鎖型別根據保護物件的不同,oracle資料庫鎖主要分為以下幾大類:dml鎖,用於保護資料
的完整性;ddl鎖,用於保護資料庫物件的結構,如表、索引等;鎖存器(latches),
用於保護資料庫例項的記憶體結構。
dml鎖的目的在於保證併發情況下的資料完整性,在執行insert、update、delete操作
時鎖定表中的資料。該類鎖既可以是行級的,也可以是表級的,且這些鎖都是隱含的,即
在dml操作期間oracle會自動施加。行級鎖又稱事務鎖(tx鎖),表級鎖又稱tm鎖。
行級鎖是鎖定表中特定資料行上的鎖,表級鎖是鎖定表中所有行的鎖
ddl鎖是使用者在做create、drop、alter操作時在表上加的鎖,該類鎖始終是表級的,
它的作用是防止兩個會話同時修改乙個表的結構,這些鎖是隱含的,即在ddl操作期間
oracle會自動施加。
鎖模式在資料庫中有兩種基本的鎖模式:獨佔鎖(exclusive locks,即x鎖)和共享鎖
(share locks,即s鎖)。當資料物件被某事務加上獨佔鎖時,其他的事務不能對該
資料物件進行讀取和修改。當資料物件被某事務加上共享鎖時,其他的事務可以對該數
據物件進行讀取,但不能對該資料物件進行修改。tx鎖只有x鎖模式,沒有s鎖模式。
tm鎖一共有五種鎖模式:行級排他鎖(rx鎖)、行級共享鎖(rs鎖)、共享鎖(s鎖)、
排他鎖(x鎖)以及共享行級排他鎖(srx鎖)。
舉例如下:
執行如下的命令後
select ..for update [nowait]
select * from tab1 for update
再對該錶進行ddl操作將會報:ora-00054:resource busy and acquire with nowait specified.
原因分析 :
此時oracle已經對返回的結果集上加了排它的行級鎖,所有其他對這些資料進行的
修改或刪除操作都必須等待這個鎖的釋放,產生的外在現象就是其他的操作將發生
阻塞,這個這個操作commit或rollback.
同樣這個查詢的事務將會對該表加表級鎖,不允許對該錶的任何ddl操作,否則將會
報出ora-00054錯誤::resource busy and acquire with nowait specified.
悲觀的缺陷是,加鎖的時間可能會很長,這樣可能會長時間的限制其他使用者的訪問,
也就是說悲觀鎖的並 發訪問性不好.
死鎖當兩個使用者希望持有對方的資源時就會發生死鎖.
即兩個使用者互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以
犧牲乙個使用者作為代價,另乙個使用者繼續執行,犧牲的使用者的事務將回滾。
場景1:使用者 1 對 a 表進行 update,沒有提交。
2:使用者 2 對 b 表進行 update,沒有提交。
此時雙反不存在資源共享的問題。
3:如果使用者 2 此時對 a 表作 update,則會發生阻塞,需要等到使用者一的事物結束。
4:如果此時使用者 1 又對 b 表作 update,則產生死鎖。此時 oracle 會選擇其中
乙個使用者進行會滾,使另乙個使用者繼續執行操作。
起因分析
oracle 的死鎖問題實際上很少見,如果發生,基本上都是不正確的程式設計造
成的,經過調整後,基本上都會避免死鎖的發生。
在 oracle 系統中能自動發現死鎖,並選擇代價最小的,即完成工作量最少的事
務予以撤消,釋放該事務所擁有的全部鎖,記其它的事務繼續工作下去。
從系統效能上考慮,應該盡可能減少資源競爭,增大吞吐量,因此使用者在給併發
操作加鎖時,應注意以下幾點:
•1、 對於 update 和 delete 操作,應只鎖要做改動的行,在完成修改後立即提交。
•2、 當多個事務正利用共享更新的方式進行更新,則不要使用共享封鎖,而應採用共
享更新鎖,這樣其它使用者就能使用行級鎖,以增加並行性。
•3、 盡可能將對乙個表的操作的併發事務施加共享更新鎖,從而可提高並行性。
•4、 在應用負荷較高的期間,不宜對基礎資料結構(表、索引、簇和檢視)進行修改
死鎖後的解決辦法
如果死鎖不能自動釋放,就需要我們手工的 kill session
鎖和阻塞概念
通常來講,系統如果平時執行正常,突然會停止不動,多半是被阻塞( blocked)住了。
我們可以通過 v$lock 這張檢視,看檢視阻塞的資訊。
引起阻塞的幾種常見情況
( 1) dml 語句引起阻塞
( 2)外來鍵沒有建立索引
資料庫大講解第十一講
主要採用的是mysql資料庫,其中會有提到其他資料庫 前期 準備 前期準備建立資料庫employe並建立多個表 前期是隨便練習後邊知識由淺入深 前邊幾頁是練習 所需要的各種表 裡面有中文符號最好自己動手敲 建立資料庫 mysql select employe tbl.emp id,employe t...
第十一講 資料清洗
資料採集完,要進行資料清洗工作,整個資料分析過程中,資料清洗工作幾乎要佔到80 的時間。資料清洗規則總結為四個關鍵點 完全合一 1 完整性 單條資料是否存在空值,統計的字段是否完善。2 全面性 觀察某一列的全部數值,比如平均值 最大值 最小值,根據常識判斷是否有問題。如 資料定義 單位標識 數值本身...
資料庫中級教程 第十四講 資料庫的浮點數的儲存
資料庫中級教程 第十四講 資料庫的浮點數的儲存 針對浮點數的儲存的精度和範圍是各種程式語言以及各種資料庫都會涉及的問題。下面以oracle的資料庫以例來說明一下 型別帶有附加引數 乙個顯示寬度指示器和乙個小數點指示器。如下圖是oracle的精度的示例 mysql 支援的三個浮點型別是 float d...