oracle鎖表


一、鎖表的處理

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

 


免責聲明!

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



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