關於oracle鎖的討論
ORACLE數據庫管理工具
http://www.91files.com/?TK0SMLAEX7QGK14KLHUL
有關視圖
v$session 查詢會話的信息
v$session_wait 查詢等待的會話信息
v$lock 列出系統中的所有鎖
dba_locks 對v$lock的格式化視圖
v$locked_object 只包含DML的鎖信息,包括回滾段和會話信息
例:怎麼殺掉特定的數據庫會話
Alter system kill session 'sid,serial#';
或者
alter system disconnect session 'sid,serial#' immediate;
在win上,還可以採用oracle提供的orakill殺掉一個線程(其實就是一個Oracle進程)在Linux/Unix上,可以直接利用kill殺掉數據庫進程對應的OS進程
例:怎麼快速查找鎖與鎖等待
數據庫的鎖是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該進程。
這個語句將查找到數據庫中所有的DML語句產生的鎖,還可以發現,任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。
可以通過alter system kill session ‘sid,serial#’來殺掉會話
SELECT /*+ rule */ s.username,decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待以下的語句可以查詢到誰鎖了表,而誰在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查詢結果是一個樹狀結構,如果有子節點,則表示有等待發生。如果想知道鎖用了哪個回滾段,還可以關聯到V$rollname,其中xidusn就是回滾段的USN
例:查詢鎖的狀況的對象有
V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;
例:查詢鎖的表的方法
SELECT S.SID SESSION_ID,S.USERNAME,DECODE(LMODE,0,'None',1,'Null',2,'Row-S (SS)',3,'Row-X (SX)',4,'Share',5,'S/Row-X (SSX)',6,'Exclusive',TO_CHAR(LMODE)) MODE_HELD,DECODE(REQUEST,0,'None',1,'Null',2,'Row-S (SS)',3,'Row-X (SX)',4,'Share',5,'S/Row-X (SSX)',6,'Exclusive',TO_CHAR(REQUEST)) MODE_REQUESTED,O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',S.TYPE LOCK_TYPE,L.ID1 LOCK_ID1,L.ID2 LOCK_ID2 FROM V$LOCK L,SYS.DBA_OBJECTS O,V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;
例:如何解鎖?
ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;
例:如何監控當前數據庫誰在運行什麼SQL語句?
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
例:鎖中字段代碼含義
type
TX 鎖定行
TM 表鎖定
lmode
1 NULL
2 行共享
3 行排他
4 共享
5 共享行排他
6 排他
例:誰被鎖住?
Select a.sid,a.serial#,a.username,A.LOCKWAIT,a.status,a.program,b.name
from v$session a,audit_actions b
where a.command=b.action
AND LOCKWAIT IS NOT NULL;
例:誰在鎖表?
Select a.sid,a.serial#,a.username,A.LOCKWAIT,a.status,a.program,b.name
from v$session a,audit_actions b
where a.command=b.action
AND STATUS=ACTIVE;
單用戶數據庫或許從來就不需要鎖,但是在一個多用戶的環
境,有一個合適地自動滿足數據的並行性、一致性和完整性的
機制是非常重要的。Oracle是通過使用一個內部鎖定機制來維
護數據的完整性、並行性和一致性。
ORACLE有兩種級別的鎖
共享鎖(Share Lock)
爲數據存取的高並行性提供保證。
專用鎖(Exclusive Lock)
防止同時共享資源。例如一個事務獲得了某一資源的專用鎖,那麼直到該鎖被解鎖,其他事務才能修改那個資源。
ORACLE鎖按類型可分爲兩種不同的鎖:
數據鎖(DML LOCK)
在表中獲得並且保護數據,從根本上說是保護數據的完整性
字典鎖(DDL LOCK)
用於保護對象的結構如表、視圖和索引的定義。在獲得DDL數據定義事務時,字典鎖將自動獲得。
數據鎖
當用戶對錶格中數據執行insert、update和delete操作時,會自動獲得數據鎖,它用來保護數據的一致性。按級別可分行級鎖、表級鎖。
DML語句會獲得兩種類型的鎖結構:
表上的共享鎖正在更改每一行的專用鎖
例如:update emp set sal=8888 where empno=7788;
注意:假如有多個用戶同時對一行進行修改,他們都會獲得共享的表鎖,但只有一個最先請求鎖的用戶纔可獲得行專用鎖。
字典鎖
當用戶創建、修改或者刪除表時將要用到字典鎖。它通常是表級別鎖,用來防止兩個用戶同時修改同一個表的結構。
專用DDL鎖:
當諸如create,alter和drop這樣的語句用於一個對象時,使用此鎖。
共享DDL鎖:
當諸如grant和create package這樣的語句用於一個對象時,使用此鎖。
手工鎖定
假如你要執行一張表中列值的全局更新並且希望事務對該表進行單獨存取,以便事務不必等待其他事務的完成該表的操作,那麼可以通過人工鎖定的該表以防止其他事務獲得該表中 的鎖。
共享鎖
例如:lock table emp in share mode;
獨享鎖
例如:lock table emp in exclusive mode;
查詢時也可手工鎖定查詢集
例如:select * from emp
where deptno=10
update for;
例如 SELECT fffs FROM fffs WHERE fffs='01'
FOR UPDATE OF fffs NOWAIT;
死鎖
死鎖是指兩個或多個用戶多在等待被彼此相互鎖定的同一數據而形成的一種局面。例如:
用戶A:update emp set sal=8888 where empno=7788;
在該軟件中可以直接查詢鎖,殺掉進程,下載地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.