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

oracle加鎖

2013-11-13 15:25:57  來源: Oracle 

  加鎖是為了防止一些操作而進行的比如說共享鎖可以防止別的事務加上排他鎖如果多個事物對同一張表都加上共享鎖的話也就都不能修改了可以進行讀操作如果只有一個事物加上共享鎖是可以修改的

  而排他鎖呢則是不能增加任何共享鎖和排他鎖因此只要獲得了排他鎖就可以去進行修改不會被任何別的事物打攪到

  DML 操作的是表裡面的數據行;

  DDL 操作的是表的元數據(表結構);隱式提交

  ORACLE裡鎖有以下幾種模式:

  none

  null 空

  RowS 行共享(RS)共享表鎖

  RowX 行專用(RX)用於行的修改

  Share 共享鎖(S)阻止其他DML操作

  S/RowX 共享行專用(SRX)阻止其他事務操作

  exclusive 專用(X)獨立訪問使用

  數字越大鎖級別越高 影響的操作越多

  一般的查詢語句如select from ;是小於的鎖 有時會在v$locked_object出現

  select from for update; 是的鎖

  當對話使用for update子串打開一個游標時

  所有返回集中的數據行都將處於行級(RowX)獨占式鎖定

  其他對象只能查詢這些數據行不能進行updatedelete或selectfor update操作

  insert / update / delete ; 是的鎖

  沒有commit之前插入同樣的一條記錄會沒有反應

  因為後一個的鎖會一直等待上一個的鎖 我們必須釋放掉上一個才能繼續工作

  創建索引的時候也會產生級別的鎖

  locked_mode為不影響DML(insertdeleteupdateselect)操作

  但DDL(alterdrop等)操作會提示ora錯誤

  有主外鍵約束時 update / delete ; 可能會產生的鎖

  DDL語句時是的鎖

  以DBA角色 查看當前數據庫裡鎖的情況可以用如下SQL語句

  select object_idsession_idlocked_mode from v$locked_object;

  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進程並不能徹底清除鎖的問題

  記得在數據庫級別用alter system kill session sidserial#;殺掉不正常的鎖

  select oobject_namelsession_idsserial#sprogramsusernamemand smachineslockwait

  from v$locked_object l all_objects o v$session s

  where oobject_id = lobject_id and ssid = lsession_id


From:http://tw.wingwit.com/Article/program/Oracle/201311/16693.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.