熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

關於Oracle幾種鎖管理的匯總

2013-11-13 22:12:16  來源: Oracle 
ORACLE裡鎖有以下幾種模式:
    none
    null 空
    RowS 行共享(RS)共享表鎖sub share
    RowX 行獨占(RX)用於行的修改sub exclusive
    Share 共享鎖(S)阻止其他DML操作share
    S/RowX 共享行獨占(SRX)阻止其他事務操作share/sub exclusive
    exclusive 獨占(X)獨立訪問使用exclusive
   
    數字越大鎖級別越高 影響的操作越多
   
    級鎖有Select有時會在v$locked_object出現
    級鎖有Select for updateLock For UpdateLock Row Share
    select for update當對話使用for update子串打開一個游標時所有返回集中的數據行都將處於行級(RowX)獨占式鎖定其他對象只能查詢這些數據行不能進行updatedelete或select for update操作
    級鎖有Insert Update Delete Lock Row Exclusive
    沒有commit之前插入同樣的一條記錄會沒有反應 因為後一個的鎖會一直等待上一個的鎖 我們必須釋放掉上一個才能繼續工作
    級鎖有Create Index Lock Share
    locked_mode為不影響DML(insertdeleteupdateselect)操作 但DDL(alterdrop等)操作會提示ora錯誤
    resource busy and acquire with NOWAIT specified
    // *Cause: Resource interested is busy
    // *Action: Retry if necessary
    級鎖有Lock Share Row Exclusive
    具體來講有主外鍵約束時update / delete ; 可能會產生的鎖
    級鎖有Alter table Drop table Drop Index Truncate table Lock Exclusive
   
    以DBA角色 查看當前數據庫裡鎖的情況可以用如下SQL語句

  col owner for a col object_name for a select bownerbobject_namelsession_idllocked_mode from v$locked_object l dba_objects b where bobject_id=lobject_id select tusernametsidtserial#tlogon_time from v$locked_object tv$session t where tsession_id=tsid order by tlogon_time


    如果有長期出現的一列可能是沒有釋放的鎖我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖
   
    alter system kill session sidserial#;
   
    如果出現了鎖的問題 某個DML操作可能等待很久沒有反應
   
    當你采用的是直接連接數據庫的方式也不要用OS系統命令 $kill process_num 或者 $kill process_num來終止用戶連接因為一個用戶進程可能產生一個以上的鎖 殺OS進程並不能徹底清除鎖的問題
From:http://tw.wingwit.com/Article/program/Oracle/201311/18456.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.