ORACLE數據庫是現今數據庫領域應用最廣泛的
同時它也是一個龐大的系統
全面了解它
玩轉它不但需要一定的理論知識
更需要開發經驗與工程經驗
本人是ORACLE一愛好者
以下是本人對ORACLE鎖的一些經驗
希望能與大家共同分享
預備知識
DDL(DATABASE DEFINITION LANGUAGE)
數據庫定義語言
如create table
drop table
DML(DATABASE MODIFICATION LANGUAGE):數據庫修改語言
如insert
delete
update
參考資料
Oracle
Administrator
s Guide
Release
Oracle
Tuning
Release
ORACLE鎖具體分為以下幾類
按用戶與系統劃分
可以分為自動鎖與顯示鎖
自動鎖
當進行一項數據庫操作時
缺省情況下
系統自動為此數據庫操作獲得所有有必要的鎖
顯示鎖
某些情況下
需要用戶顯示的鎖定數據庫操作要用到的數據
才能使數據庫操作執行得更好
顯示鎖是用戶為數據庫對象設定的
按鎖級別劃分
可分為共享鎖與排它鎖
共享鎖
共享鎖使一個事務對特定數據庫資源進行共享訪問——另一事務也可對此資源進行訪問或獲得相同共享鎖
共享鎖為事務提供高並發性
但如拙劣的事務設計+共享鎖容易造成死鎖或數據更新丟失
排它鎖
事務設置排它鎖後
該事務單獨獲得此資源
另一事務不能在此事務提交之前獲得相同對象的共享鎖或排它鎖
按操作劃分
可分為DML鎖
DDL鎖
+DML鎖又可以分為
行鎖
表鎖
死鎖
行鎖
當事務執行數據庫插入
更新
刪除操作時
該事務自動獲得操作表中操作行的排它鎖
表級鎖
當事務獲得行鎖後
此事務也將自動獲得該行的表鎖(共享鎖)
以防止其它事務進行DDL語句影響記錄行的更新
事務也可以在進行過程中獲得共享鎖或排它鎖
只有當事務顯示使用LOCK TABLE語句顯示的定義一個排它鎖時
事務才會獲得表上的排它鎖
也可使用LOCK TABLE顯示的定義一個表級的共享鎖(LOCK TABLE具體用法請參考相關文檔)
死鎖
當兩個事務需要一組有沖突的鎖
而不能將事務繼續下去的話
就出現死鎖
如事務
在表A行記錄#
中有一排它鎖
並等待事務
在表A中記錄#
中排它鎖的釋放
而事務
在表A記錄行#
中有一排它鎖
並等待事務;
在表A中記錄#
中排它鎖的釋放
事務
與事務
彼此等待
因此就造成了死鎖
死鎖一般是因拙劣的事務設計而產生
死鎖只能使用SQL下:alter system kill session
sid
serial#
或者使用相關操作系統kill進程的命令
如UNIX下kill
sid
或者使用其它工具殺掉死鎖進程
+DDL鎖又可以分為
排它DDL鎖
共享DDL鎖
分析鎖
排它DDL鎖
創建
修改
刪除一個數據庫對象的DDL語句獲得操作對象的 排它鎖
如使用alter table語句時
為了維護數據的完成性
一致性
合法性
該事務獲得一排它DDL鎖
共享DDL鎖
需在數據庫對象之間建立相互依賴關系的DDL語句通常需共享獲得DDL鎖
如創建一個包
該包中的過程與函數引用了不同的數據庫表
當編譯此包時
該事務就獲得了引用表的共享DDL鎖
分析鎖
ORACLE使用共享池存儲分析與優化過的SQL語句及PL/SQL程序
使運行相同語句的應用速度更快
一個在共享池中緩存的對象獲得它所引用數據庫對象的分析鎖
分析鎖是一種獨特的DDL鎖類型
ORACLE使用它追蹤共享池對象及它所引用數據庫對象之間的依賴關系
當一個事務修改或刪除了共享池持有分析鎖的數據庫對象時
ORACLE使共享池中的對象作廢
下次在引用這條SQL/PLSQL語句時
ORACLE重新分析編譯此語句
內部闩鎖
內部闩鎖
這是ORACLE中的一種特殊鎖
用於順序訪問內部系統結構
當事務需向緩沖區寫入信息時
為了使用此塊內存區域
ORACLE首先必須取得這塊內存區域的闩鎖
才能向此塊內存寫入信息
以上是 本人對ORACLE鎖的一些總結
不足之處還望大家海涵
同時也希望大家多提出自己對ORACLE鎖的一些看法
From:http://tw.wingwit.com/Article/program/Oracle/201311/16769.html