oracle鎖表原因和如何解鎖分享


最近項目項目開始忙起來了,就不嗶嗶了,直接給你們看東西好了。

查鎖表

 
 select a.OS_USER_NAME, c.owner, c.object_name, b.sid, b.serial#, logon_time 
  from v$locked_object a, v$session b, dba_objects c 
 where a.session_id = b.sid 
   and a.object_id = c.object_id 
 order by b.logon_time; 
 

解鎖

ALTER SYSTEM KILL SESSION '129,77'; 
 

 

查什么系統導致上的鎖

select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=129
 
 

查看什么語句導致鎖表的

select l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
  from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
   and s.prev_sql_addr = a.address
order by sid, s.serial#;
 

查看有幾個表被鎖

select count(*) from v$locked_object;
 
 

查表SPID

129是通過查鎖表查出來的SID
select spid, oSUSEr, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=129
 

當Kill不能解鎖時,Ctrl+R CMD 輸入下面這句,結束線程。

22860是Oracle鎖表線程IP,你自己要替換一下你自己的,怎么查,上面分享了
 
orakill orcl 22860
 
 

 鎖表可能原因

1、鎖表的原理:數據庫使用獨占式封鎖機制,當執行上面的語句時,對表進行鎖住,直到發生commite 或者 回滾 或者退出數據庫用戶 
2、主要的鎖表原因有: 
(1) A程序執行了對 tableA 的 insert ,並還未 commite時,B程序也對tableA 進行insert 則此時會發生資源正忙的異常 就是鎖表
(2)鎖表常發生於並發而不是並行(並行時,一個線程操作數據庫時,另一個線程是不能操作數據庫的,cpu 和i/o 分配原則)
3、減少鎖表的概率方法:
(1)減少insert 、update 、delete 語句執行 到 commite 之間的時間。具體點批量執行改為單個執行、優化sql自身的非執行速度
(2)如果異常對事物進行回滾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM