ORACLE裡鎖有以下幾種模式:
none
null 空
Row
S 行共享(RS)
共享表鎖
sub share
Row
X 行獨占(RX)
用於行的修改
sub exclusive
Share 共享鎖(S)
阻止其他DML操作
share
S/Row
X 共享行獨占(SRX)
阻止其他事務操作
share/sub exclusive
exclusive 獨占(X)
獨立訪問使用
exclusive
數字越大鎖級別越高
影響的操作越多
級鎖有
Select
有時會在v$locked_object出現
級鎖有
Select for update
Lock For Update
Lock Row Share
select for update當對話使用for update子串打開一個游標時
所有返回集中的數據行都將處於行級(Row
X)獨占式鎖定
其他對象只能查詢這些數據行
不能進行update
delete或select for update操作
級鎖有
Insert
Update
Delete
Lock Row Exclusive
沒有commit之前插入同樣的一條記錄會沒有反應
因為後一個
的鎖會一直等待上一個
的鎖
我們必須釋放掉上一個才能繼續工作
級鎖有
Create Index
Lock Share
locked_mode為
不影響DML(insert
delete
update
select)操作
但DDL(alter
drop等)操作會提示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
sid
serial#
;
如果出現了鎖的問題
某個DML操作可能等待很久沒有反應
當你采用的是直接連接數據庫的方式
也不要用OS系統命令 $kill process_num 或者 $kill
process_num來終止用戶連接
因為一個用戶進程可能產生一個以上的鎖
殺OS進程並不能徹底清除鎖的問題
From:http://tw.wingwit.com/Article/program/Oracle/201311/18456.html