Oracle 死鎖處理

2021-10-02 06:20:16 字數 2120 閱讀 4803

鎖機制是oracle用來滿足隔離性,一致性的重要機制。但是不合理的業務邏輯可能導致死鎖的產生,生產環境如果發生大量死鎖,可能對業務造成很大的影響,所以必須及時處理。

通過 dba_blockers 檢視,可以查到死鎖的程序。

我這裡由於是 19c ,所以多了一列 con_id ,表示哪個 pdb。

-- 通過以下 sql 定位死鎖發生的 session 及 物件

欄位名含義

session_id

session id 。與 serial# 共同確定會話

serial#

session serial number(會話編號)。與 session_id 共同確定會話

username

oracle username 。被鎖語句的執行者

name

被鎖物件的名字

lockwait

address of the lock the session is waiting for; null if none

status

status of the session

machine

operating system machine name (主機名)

program

operating system program name (連線用得客戶端型別)

status of the session:

-- 通過以下 sql 可以定位到被阻塞的 sql 文字

select sql_text

from v$sql

where hash_value in

(select sql_hash_value

from v$session

where sid in

(select session_id from v$locked_object)

);

解決死鎖的方式一般就是殺掉乙個 session。

通過上面的查詢定位到了一對 session ,其中 session_id 1457 的 session 阻塞了 session_id 1698 的 session。

那麼最好的處理辦法事殺掉 session_id 1457 的 session (也就是造成阻塞的 session),這樣 被阻塞的 session 上的 sql 還可以繼續執行。也可以殺掉被阻塞的 session ,這樣被阻塞 session 上的 sql 就會失敗(不推薦)。

-- 殺掉 session 的 sql

alter system kill

session

'session_id,serial#'

;-- 該例子中使用的語句如下:

alter system kill

session

'1457,63336'

;

如果生產系統經常出現死鎖,肯定是程式有邏輯上的問題。這個時候就需要通過定位 sql 找到死鎖的原因,才能從根本上解決問題。

Oracle 死鎖處理

一 資料庫死鎖的現象 程式在執行的過程中,點選確定或儲存按鈕,程式沒有響應,也沒有出現報錯。二 死鎖的原理 當對於資料庫某個表的某一列做更新或刪除等操作,執行完畢後該條語句不提 交,另一條對於這一列資料做更新操作的語句在執行的時候就會處於等待狀態,此時的現象是這條語句一直在執行,但一直沒有執行成功,...

oracle死鎖處理方法

招數一 1.檢視被鎖的表 2.select p.spid,c.object name,b.session id,b.oracle username,b.os user name from v process p,v session a,v locked object b,all objects c ...

ORACLE中表死鎖的處理

oracle中表死鎖的處理 在進行資料庫管理的過程中,經常會出現資料表被使用者的一些不合理操作而導致表被鎖定的情況,以下主要介紹如何查詢哪些表被哪個使用者所鎖定,以及如何解除鎖定 1.查詢被鎖定的表 如果想知道具體是哪個程序阻塞了哪個程序,可用以下語句檢視 select username,v loc...