Oracle 鎖工作原理

三種現象:
  • 脹讀取:一個事物讀取了被其他事物寫入但未提交的數據
  • 不可重複讀取:一個事物再次讀取曾經讀取過,發現數據已經被其他已經提交的事物修改或者刪除
  • 不存在讀取:事物按照之前查詢條件重新查詢,返回的結果集中包含其他已提交事務插入滿足條件的新數據
SQL92標準的隔離級別
  • 未提交讀取
  • 已提交讀取
  • 不可重複讀取
  • 串行化
            
 

          現象 髒讀取 不可重複讀取 不存在讀取
隔離級別

未提交讀取(read uncommitted) 允許 允許 允許
已提交讀取(read committed) 不允許 允許 允許
可重複讀取(repeatable read) 不允許 不允許 允許
串行化(rerializable) 不允許 不允許 不允許
Oracle支持事務隔離級別
已提交讀取:
串行化:串行化隔離的事務只能看到事務執行前就已經提交數據,以及事務內Insert、Update、及delete語句對數據的修改。串行化隔離的事務不會出現不可重複讀取或不存在的讀取的現象
只讀模式:只讀事務只能看到事務執行前就已經提交的數據,且事務中不能執行Insert、Update及Delete語句

set transaction isolation level read commited
set transaction isolation level serializable
set transaction read only
髒數據就是讀到database buffer cache做了修改但還沒有寫到datafile裏面的數據,只要沒有寫入數據文件,不管是否提交,都可以稱爲髒數據。

鎖:是防止訪問相同資源的事務產生破壞性交互的機制

鎖模式:
排他鎖:能夠阻止共享被加鎖的資源。對數據進行修改時必須獲得此種模式的鎖。第一個排他地對資源加鎖的事務是唯一可以對此資源進行修改的事務,直至排他鎖被釋放
共享鎖:依據操作類型有條件地允許共享被加鎖的資源。對數據進行讀取的多個用戶可共享此數據,這些用戶可以對資源加以共享鎖,防止其他用戶併發地修改此資源。多個事務可以對相同的資源加共享鎖



描述

DML 鎖(數據鎖)
 
DML 的作用是保護數據。例如,表級鎖(table lock)對整個表加鎖,行級鎖(row lock)則對選定的數據行加鎖。
 
DDL 鎖(數據字典鎖)
 
DDL 鎖的作用是保護方案對象的結構。例如,表及視圖的定義。
 
內部鎖(internal lock)及閂鎖(latch)
 
內部鎖及閂鎖用於保護數據庫的內部結構,例如,數據文件。內部鎖及閂鎖的管理完全由 Oracle 自動完成。
 

行共享表級鎖(row share table lock  RS):表明擁有此鎖的事務已鎖定了表內的某些數據行,並有意對數據進行更新操作
SELECT....FROM table ....FOR UPDATE OF ......
LOCK TABLE table  IN ROW SHARE MODE
允許操作:某個事務擁有了某個表的行共享表級鎖後,其他事務依然可以併發地對相同數據表執行查詢,插入,更新,刪除操作,或對錶內數據行加鎖的操作。也就是說,其他事務同時也能獲得相同表上的行共享鎖,行排他共享,及共享行排他模式的表級鎖。
禁止操作:某個事務擁有了某個表的行共享表級鎖後,只會禁止其他事務通過以下語句排他對相同表進行寫操作。LOCK TABLE table IN EXCLUSIVE MODE;

行排他表級鎖(row exclusive table lock   RX):通常表面擁有此鎖 的事務已經對錶內的某些數據進行了更新操作。
INSERT INTO table.....
UPDATE table.....
DELETE FROM table.....
LOCK TABLE table IN ROW EXCLUSIVE MODE;
允許操作:某個事務擁有了某個表的行排他表級鎖後,其他事務依然可以併發地對相同數據表執行查詢,插入,更新,刪除操作,或對錶內數據行加鎖操作。即行排他表級鎖允許其他多個事務同時獲得相同表上的行共享表級鎖或行排他表級鎖
禁止操作:某個事務擁有了某個表的行排他表級鎖後,將禁止其他事務手工地對錶加鎖進行排他地讀寫操作,因此其他語句不能對相同表加鎖
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHAE EXCLUSIVE MODE
LOCK TABLE table IN EXCLUSIVE MODE;

共享鎖(share table lock   S):LOCK TABE table IN SHAE MODE
允許操作:某個事務擁有了某個表的共享表級鎖後,其他事務可以查詢表,可以使用select ......for update 語句鎖定選中的數據行,也能夠成功執行LOCK TABLE .......IN SHARE MODE 語句。但其他事務不能對錶進行更新操作。多個事務可以併發地獲得同一個表上的共享表級鎖,在此種情況下任何事務都不能對錶進行更新。因此,擁有共享表級鎖的事務只能在此表上沒有其他事務的共享表級鎖時,才能對錶進行更新操作
禁止操作:某個事務擁有了某個表的共享級鎖後,將禁止其他事務修改此表,同時禁止其他事務執行以下語句
LOCK TABLE table IN ROW EXCLUSIVE MODE
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;

共享行排他表級鎖(share row exclusive table lock SRX):LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
允許操作:同一時間只有一個事務 能夠獲得表的共享行排他表級鎖,某個事務擁有了某個表的共享行排他表級鎖後,其他事務可以查詢表,可以使用select ....for update 語句鎖定選中的數據行,當不能對錶進行更新操作
禁止操作:擁有共享行排他表級鎖的事務將阻止其他事務獲取行排他表級鎖來修改數據,共享行排他表級鎖還能阻止其他事務在相同表上獲取共享表鎖,共享行排他表級鎖及排他表級鎖
LOCK TABLE table IN ROW EXCLUSIVE MODE;
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;

排他表級鎖(exclusive table lock  X):LOCK TABLE table IN EXCLUSIVE MODE;
允許操作:同一時間只有一個事務能獲得表上的排他表級鎖。一個事務獲得表級鎖後,其他事務只能對錶進行查詢操作
禁止操作:一個事務獲得排他表級鎖後,將禁止其他事務對錶執行任何DML操作,其他事務無法獲取表上任何類型的鎖












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章