Oracl 發生鎖表--解鎖sql

7ethe發表於2018-02-01

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'''

相關文章