1. 程式人生 > 資料庫 >資料庫鎖表處理彙總

資料庫鎖表處理彙總

日常工作中偶爾會遇到鎖表的情況,每次鎖表都要在網上或筆記中去找語句進行處理。在這裡做一個彙總,方便以後查閱。
當然鎖表大多數情況肯定是程式碼不健康導致的。對症下藥,處理異常邏輯應該放在第一位。

鎖表原理

資料庫使用獨佔式封鎖機制,當執行insert update delete時,對錶進行鎖住,直到發生 commite 或者 回滾 或者 退出資料庫使用者。
如 當A程式執行了對 tableA 的 insert,並還未 commite 時,B程式也對 tableA 進行 insert,則此時會發生資源正忙的異常,就是鎖表。

Oracle鎖表時用

檢視鎖表程序SQL語句:

語句1:被鎖物件表、資料庫物件表、資料session表關聯來獲取被鎖物件對應的是那個session

select sess.sid, 
sess.serial#, 
lo.oracle_username, 
lo.os_user_name, 
ao.object_name, 
lo.locked_mode 
from v$locked_object lo, 
dba_objects ao, 
v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid;

語句2:

select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
檢視導致鎖表的sql語句是那一條
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#;
殺掉鎖表程序

通過上面的查詢獲取SID和serial#,替換下面的x,y,就可以解除被鎖的狀態

alter system kill session 'x,y';

SqlServer鎖表時用

查詢鎖表id

spid :被鎖程序ID
tableName:發生死鎖的表名

SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName FROM sys.dm_tran_locks WHERE resource_type='OBJECT ' 
使用kill關鍵字來殺掉被鎖的程序ID就可以對錶進行解鎖
KILL 99