oracle中lock的解釋

2021-04-29 03:41:39 字數 2231 閱讀 3485

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。

加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。

在資料庫中有兩種基本的鎖型別:排它鎖(exclusive locks,即x鎖)和共享鎖(share locks,即s鎖)。當資料物件被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的資料物件可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖型別來對資料庫的事務進行併發控制。

根據保護的物件不同,oracle資料庫鎖可以分為以下幾大類:

dml鎖(data locks,資料鎖),用於保護資料的完整性;

ddl鎖(dictionary locks,字典鎖),用於保護資料庫物件的結構,如表、索引等的結構定義;

內部鎖和閂(internal locks and latches),保護資料庫的內部結構,應用於sga;

在我們實際應用開發中涉及較多的是dml鎖,其他兩種的話dba會更加關心點;

dml鎖的目的在於保證併發情況下的資料完整性,主要包括tm鎖和tx鎖,其中tm鎖稱為表級鎖,tx鎖稱為事務鎖或行級鎖。

當oracle執行dml語句時,系統自動在所要操作的表上申請tm型別的鎖。當tm鎖獲得後,系統再自動申請tx型別的鎖,並將實際鎖定的資料行的鎖標誌位進行置位。這樣在事務加鎖前檢查tx鎖相容性時就不用再逐行檢查鎖標誌,而只需檢查tm鎖模式的相容性即可,大大提高了系統的效率。tm鎖包括了ss、sx、s、x等多種模式,在資料庫中用0-6來表示。不同的sql操作產生不同型別的tm鎖。如下圖所示:

值  鎖模式  鎖描述  sql

0  none   

1  null  空  select

2  ss(row-s)  行級共享鎖

其他物件只能查詢這些資料行  select for update、lock for update、

lock row share

3  sx(row-x)  行級排它鎖

在提交前不允許做dml操作  insert、update、delete、

lock row share

4  s(share)  共享鎖  create index、lock share

5  ssx(s/row-x)  共享行級排它鎖  lock share row exclusive

6  x(exclusive)  排它鎖  alter table、drop table、drop index、

truncate table、lock exclusive

在資料行上只有x鎖(排他鎖)。在 oracle資料庫中,當乙個事務首次發起乙個dml語句時就獲得乙個tx鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 dml語句時,第乙個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第乙個會話提交後,tx鎖被釋放,其他會話才可以加鎖。

在大概了解oracle的鎖機制之後,我們來解決幾個基本的問題:

1.update/delete操作會將rs鎖定,直至操作被commit或者rollback;

若操作未commit之前其他session對同樣的rs做變更操作,則操作會被hold,直至前session的update/delete操作被commit;

2.session內外select的rs範圍

前提:insert、update操作未commit之前進行select;

若在同一session內,select出來的rs會包括之前insert、update影響的記錄;

若不在同一session內,select出來的rs不會包括未被commit的記錄;

3.select.... for update [of cols] [nowait/wait] [skip locked]

of cols:只鎖定指定字段所在表的rs,而沒有指定的表則不會鎖定,只會在多表聯合查詢時出現;

nowait:語句不會hold,而是直接返回錯誤ora-0005

Oracle中dual的解釋

q dual是什麼?a dual是乙個系統表,不能刪除或者修改其表結構。它的名稱叫做 偽表 或者 啞表 檢視其表結構 sql desc dual 名稱 是否為空?型別 dummy varchar2 1 其欄位只有乙個 dummy 中文叫做 啞巴 長度只有1。這個表結構只供參考。oracle的sele...

oracle中的Raw型別解釋

raw,類似於char,宣告方式raw l l為長度,以位元組為單位,作為資料庫列最大2000,作為變數最大32767位元組。long raw,類似於long,作為資料庫列最大儲存2g位元組的資料,作為變數最大32760位元組 建表操作 create table raw test id number...

Oracle中的Raw型別解釋

oracle中的raw型別解釋 raw,類似於char,宣告方式raw l l為長度,以位元組為單位,作為資料庫列最大2000,作為變數最大32767位元組。long raw,類似於long,作為資料庫列最大儲存2g位元組的資料,作為變數最大32760位元組 建表操作 create table ra...