中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle鎖表如何解決

發布時間:2022-06-06 10:33:46 來源:億速云 閱讀:138 作者:zzz 欄目:開發技術

這篇文章主要介紹“Oracle鎖表如何解決”,在日常操作中,相信很多人在Oracle鎖表如何解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Oracle鎖表如何解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言

鎖表或鎖超時相信大家都不陌生,經常發生在DML語句中,產生的原因就是數據庫的獨占式封鎖機制,當執行DML語句時對表或行數據進行鎖住,直到事務提交或回滾或者強制結束當前會話。

對于我們的應用系統而言鎖表大概率會發生在SQL執行慢并且沒有超時的地方(一條SQL由于某種原因(Spoon工具做數據抽取與推送)一直執行不成功并且一直不釋放資源)因此寫出高效率SQL也尤為重要!還有另外情況也會發生鎖表,就是高并發場景,高并發會帶來的問題就是Spring事務會造成數據庫事務未提交產生死鎖(當前事務等待其他事務釋放鎖資源)!從而拋出異常java.sql.SQLException: Lock wait timeout exceeded;。

那么如何解決鎖表或鎖超時呢?臨時性解決方案就是找出鎖資源競爭的表或語句,直接結束當前會話或sesstion,強制釋放鎖資源。例如

解決方法如下:

1、session1修改某條數據但是不提交事務,session2查詢未提交事務的那條記錄

Oracle鎖表如何解決

2、session2嘗試修改

Oracle鎖表如何解決

我們可以看到修改未提交事務的記錄會處于一直等待狀態,直到對方釋放鎖資源或強制關閉session1。這里也說明了Oracle做到了行級鎖!

這里只是簡單的模擬了出現鎖表情況,可以一眼看出就是session1導致的鎖表。實際開發中遇到這種情況一般都是使用SQL直接查出鎖資源競爭的表或語句然后進行資源的強制釋放!!

3、session3查詢競爭資源的表或語句,強制釋放資源

-- 查詢未提交事務的session信息,注意執行以下SQL,用戶需要有DBA權限才行
SELECT
    L.SESSION_ID,
    S.SERIAL#,
    L.LOCKED_MODE AS 鎖模式,
    L.ORACLE_USERNAME AS 所有者,
    L.OS_USER_NAME AS 登錄系統用戶名,
    S.MACHINE AS 系統名,
    S.TERMINAL AS 終端用戶名,
    O.OBJECT_NAME AS 被鎖表對象名,
    S.LOGON_TIME AS 登錄數據庫時間
FROM V$LOCKED_OBJECT L
    INNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_ID
    INNER JOIN V$SESSION S ON S.SID = L.SESSION_ID
WHERE 1 = 1

查詢結果如下

Oracle鎖表如何解決

對我們強制釋放資源有用的只有前面兩個字段,例如

-- 強制 結束/kill 鎖表會話語法
ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';

-- 強制殺死session1,讓session2可以修改id=5的那條記錄
ALTER SYSTEM KILL SESSION '34, 111';

強制殺死session1后,注意觀察session2的執行情況!我們會發現session2的等待會立即終止并執行!相信小伙伴們都有一個疑惑,session_id有29和34,如何確定他們屬于session1還是session2,保證殺死的是session1讓session2成功執行DML語句?

其實也很簡單,這里的判斷方式就是session1執行更新但不提交事務,可先用以上SQL查詢未提交事務的session信息,此時查到的就是session1的信息。

到此,關于“Oracle鎖表如何解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滕州市| 岑巩县| 泰州市| 靖州| 青龙| 林西县| 合阳县| 蓬安县| 红安县| 扎鲁特旗| 合水县| 公安县| 黔东| 东平县| 安新县| 昆明市| 北川| 高碑店市| 射洪县| 房山区| 瑞安市| 新野县| 吴堡县| 嘉黎县| 民勤县| 安西县| 临武县| 扶沟县| 锡林浩特市| 宜川县| 三亚市| 保亭| 佛坪县| 韶关市| 温州市| 新乐市| 英吉沙县| 九龙坡区| 永顺县| 元江| 淄博市|