首先你要知道表鎖住了是不是正常鎖?因為任何DML語句都會對表加鎖。
創(chuàng)新互聯公司服務項目包括東安網站建設、東安網站制作、東安網頁制作以及東安網絡營銷策劃等。多年來,我們專注于互聯網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯網行業(yè)的解決方案,東安網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到東安省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
你要先查一下是那個會話那個sql鎖住了表,有可能這是正常業(yè)務需求,不建議隨便KILL session,如果這個鎖表是正常業(yè)務你把session kill掉了會影響業(yè)務的。
建議先查原因再做決定。
(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)查看是哪個sql引起的
select b.username,b.sid,b.serial#,c.* from v$locked_object a,v$session b,v$sql c where a.session_id = b.sid
and b.SQL_ID = c.sql_id and c.sql_id = ''
order by b.logon_time;
(5)殺掉對應進程
執(zhí)行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.
在對指定表做append操作,其他再做truncate時候,會產生鎖表,如下驗證步驟,
1、創(chuàng)建測試表,
create table test_lock(id number, value varchar2(200));
2、執(zhí)行append語句;并且不做提交,insert /*+append*/ into test_lock values(1,1);
3、再次執(zhí)行清表語句,truncate table test_lock;報鎖表錯誤,
4、查看鎖表語句,發(fā)現被鎖表,
select b.object_name, t.*
from v$locked_object t, user_objects b
where t.object_id = b.object_id
1.創(chuàng)建測試表,如下圖。
createtabletest_lock(idnumber,valuevarchar2(200));
2.執(zhí)行append語句;并且不做提交,insert/*+append*/intotest_lockvalues(1,1)如下圖。
3.再次執(zhí)行清表語句,truncatetabletest_lock;報鎖表錯誤,如下圖。
4.查看鎖表語句,發(fā)現被鎖表
selectb.object_name,t.*
fromv$locked_objectt,user_objectsb
wheret.object_id=b.object_id
注意事項:
簡化數據:可以將復雜的查詢創(chuàng)建為其他人可以使用的視圖,而不必了解復雜的業(yè)務或邏輯關系。這簡化并掩蓋了視圖用戶數據的復雜性。
表結構設計的補充:在設計的系統(tǒng)才剛剛開始,大部分的程序直接訪問數據表結構,但是隨著業(yè)務的變化,系統(tǒng)更新,等等,引起了一些表結構不適用,這次修改系統(tǒng)的表結構太大,開發(fā)成本較高的影響。
這個時候可以創(chuàng)建一個視圖來補充表結構設計,降低開發(fā)成本。程序可以通過查詢視圖直接獲得它想要的數據。
添加安全性:視圖可以向用戶顯示表中的指定字段,而不是向用戶顯示表中的所有字段。在實際開發(fā)中,視圖通常作為提供數據的一種方式提供,并將只讀權限提供給第三方以供查詢使用。
下面3個語句是我經常使用來解決oracle鎖問題的 -- 注意你的用戶有沒有權限問題
1. 查看被鎖的表
SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,
b.os_user_name
FROM v$process p, v$session a, v$locked_object b, all_objects c
WHERE p.addr = a.paddr AND a.process = b.process
AND c.object_id = b.object_id
2. 查看是哪個進程鎖的
SELECT sid, serial#, username, osuser FROM v$session where osuser = 'tangpj'
3. 殺掉這個進程 alter system kill session 'sid,serial#';
SELECT?object_name,?machine,?s.sid,?s.serial#?
FROM?gv$locked_object?l,?dba_objects?o,?gv$session?s?
WHERE?l.object_id =?o.object_id?
AND?l.session_id?=?s.sid;
如果沒有結果就是沒有被鎖定的,如果查詢有結果,就說明此表被鎖了。如圖: