資料庫鎖表處理彙總
阿新 • • 發佈:2021-01-14
日常工作中偶爾會遇到鎖表的情況,每次鎖表都要在網上或筆記中去找語句進行處理。在這裡做一個彙總,方便以後查閱。
當然鎖表大多數情況肯定是程式碼不健康導致的。對症下藥,處理異常邏輯應該放在第一位。
鎖表原理
資料庫使用獨佔式封鎖機制,當執行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