一、鎖表的處理
Oracle鎖表比較簡單,查詢鎖表的session殺掉就可以了。
1、以下幾個為相關表
SELECT * FROM V$LOCK; SELECT * FROM V$SQLAREA; SELECT * FROM V$SESSION; SELECT * FROM V$PROCESS; SELECT * FROM V$LOCKED_OBJECT; SELECT * FROM ALL_OBJECTS; SELECT * FROM V$SESSION_WAIT;
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、查看那個用戶那個進程造成死鎖
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、查看連接的進程
SELECT SID, SERIAL#, USERNAME, OSUSER FROM V$SESSION;
5、查出鎖定表的sid, serial#,os_user_name, machine_name, terminal,鎖的type,mode
SELECT S.SID, S.SERIAL#, S.USERNAME, S.SCHEMANAME, S.OSUSER, S.PROCESS, S.MACHINE, S.TERMINAL, S.LOGON_TIME, L.TYPE FROM V$SESSION S, V$LOCK L WHERE S.SID = L.SID AND S.USERNAME IS NOT NULL ORDER BY SID;
6、 這個語句將查找到數據庫中所有的DML語句產生的鎖,還可以發現,任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。
7、殺掉進程 sid,serial#
ALTER SYSTEM KILL SESSION'210,11562';
二、for update 與 rowid 區別
有時候部分技術人員在更新記錄時會忘記提交事務,造成鎖表。故引出此內容。
1、Oracle 更新表的方式常用的幾種:
(1)、update 表名 set 字段1=值1,字段2=值2 ... where 過濾條件;
(2)、select * from 表名 where 過濾條件 for update ;--鎖定某行記錄或整張表,一直等待,直到提交或回滾。
拓展:
select * from 表名 where 過濾條件 for update of 列名 ;(用在多表連接鎖定時,可以指定要鎖定的是哪幾張表,而如果表中的列沒有在for update of 后面出現的話,就意味着這張表其實並沒有被鎖定,其他用戶是可以對這些表的數據進行update操作的。這種情況經常會出現在用戶對帶有連接查詢的視圖進行操作場景下。用戶只鎖定相關表的數據,其他用戶仍然可以對視圖中其他原始表的數據來進行操作。 )
select * from 表名 where 過濾條件 for update 【of 列名】 wait 時間;--等待n秒后返回錯誤提示
select * from 表名 where 過濾條件 for update【of 列名】 nowait ;--馬上返回錯誤提示
(3)、select 要更新的字段,rowid from 表名 where 過濾條件;
(4)、merge語句(用的相對比較少)
2、for update與rowid區別
for update :當語句運行時,會在對應行(where子句)加上行級鎖,無where子句等於全表上鎖。若遇到客戶端斷網、測試人員忘記提交\回滾事務,則會發生鎖表。
rowid: 運行后並未給數據加上行級鎖(通過物理地址去確定某一行數據),但可以編輯數據,提交事務的瞬間完成上鎖、提交、解鎖等動作,不易發生鎖表。
參考:
https://www.cnblogs.com/XQiu/p/5212787.html
oracle for update和for update nowait的區別 - 全威儒 - 博客園 https://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html
【Oracle】-for update 與 rowid - zhaizhai的博客 - CSDN博客 http://blog.csdn.net/zhailihua/article/details/78716347