Oracl 發生鎖表–解鎖sql
整理文件時,發現了這個文件,想起了當時在項目測試上線時由於鎖表造成的重大事故,不由地心生感慨,想來還是把這個分享給大家吧。
鎖表原因:
當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對併發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。當兩個事務需要一組有衝突的鎖,而不能將事務繼續下去的話,就會出現死鎖,嚴重影響應用的正常執行。
在數據庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。數據庫利用這兩 種基本的鎖類型來對數據庫的事務進行併發控制。
關於共享鎖和排他鎖總結:
1mysql InnoDB引擎默認的修改數據語句,update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型
2排他鎖不能和其他鎖共存
3共享鎖可以和其他鎖共存(由於排他鎖的特性,共享鎖只能和共享鎖共存)
詳見:https://www.cnblogs.com/edgedance/p/6979612.html
--查詢是什麼SQL引起了鎖表的原因,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#;
-- ORACLE中查看當前系統中鎖表情況 查詢SQL如下:
select object_name,
machine,
s.sid,
serial#
from
v$locked_object l,dba_objects o,v$session s
where
l.OBJECT_ID = o.OBJECT_ID and l.SESSION_ID = s.SID
--列出所有相關信息
select * from
v$locked_object l,dba_objects o,v$session s
where
l.OBJECT_ID = o.OBJECT_ID and l.SESSION_ID = s.SID
--解鎖語句 SID和Serial#共同確定一唯一的session
alter system kill session 'SID,serial#';
... prompt'''