Oracle鎖競爭和管理 CUUG

murkey發表於2014-01-08

http://bbs.cuug.com/forum.php?mod=viewthread&tid=1335&extra=page%3D1


? 定義鎖級別
? 列舉引起鎖衝突的原因
? 使用Oracle工具檢測鎖衝突
? 解決衝突
? 避免鎖衝突
? 瞭解oracle丟擲的死鎖錯誤

 


自動管理
High level of data concurrency
– DML事務需要行級別鎖
– 查處不需要鎖
資料的一致性
共享和排他鎖
事務結束鎖才會釋放
靜默資料庫(Quiesced database)

鎖:lock應用在資料塊
栓:latch應用在記憶體

靜默資料庫:處於該模式下的資料庫只允許sys使用者登入,其他使用者無法登入

alter system quiesce restricted;

alter system suspend.資料庫停頓


鎖分類:DML鎖和DDL鎖

DML鎖:表級別鎖
       行級別鎖
      
一個DML事物至少兩個鎖:表共享鎖 行排它鎖

以佇列方式管理鎖
– 等待鎖資源
– 請求鎖的模式
– 使用者請求鎖的順序


查詢鎖競爭簡單方法:
1)建立catblock.sql
2)查詢utllockt.sql
查詢到了那個使用者佔用鎖,那個使用者正在請求鎖


select sid,serial#,username,status,PROGRAM, MACHINE  from v$session
where sid=198;
利用MACHINE通知使用者

也可以利用alter system kill 'sid,seria#';方式kill

表級別鎖
表級別鎖自動分配:
? 行排他鎖(RX): INSERT, UPDATE,
DELETE
? 行共享鎖(RS): SELECT... FOR
UPDATE


表級別鎖
? 手工鎖表語句:
? 共享 (S)
– 不能坐DML操作
– 隱式被引用來保證資料的完整性

表級別鎖
? 行級共享排他鎖 (SRX)
– 不能做DML操作
– 隱式被引用來保證資料的完整性
– 在外來鍵上需要建立索引
– Oracle9i:
? 資料完整性約束已經改變.
? 在外來鍵列不需要建立索引.
? 排他(Exclusive )


DDL 鎖
? 下面情況需要使用DDL排他鎖:
– DROP TABLE
– ALTER TABLE
(當DDL語句執行完畢之後,鎖才會釋放.)
? 下面情況需要使用DDL 共享鎖:
– CREATE PROCEDURE
– AUDIT
(當DDL語句解析完畢之後,鎖才會釋放.)
? 當共享sql區域裡面有語句作廢時,會使用可分解的解
析鎖.


鎖衝突的原因
? 使用高階別的鎖
? 時間很長的事務
? 沒有及時提交事務
? 其它產品使用高階別的鎖

V$LOCK
V$LOCKED_OBJECT
DBA_WAITERS
DBA_BLOCKERS

oracle會自動檢測到死鎖,而且會自動處理
1、oracle會把第一個事務最後一個操作給取消,提供使用者完成事物的介面。
2、當事物2完成以後,我們要重新執行第一個使用者最後一條SQL
會寫入到trace檔案中,alert日誌中

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/500314/viewspace-1068539/,如需轉載,請註明出處,否則將追究法律責任。

相關文章