Oracle鎖表解決方法的詳細(xì)記錄
前言
鎖表或鎖超時(shí)相信大家都不陌生,經(jīng)常發(fā)生在DML語句中,產(chǎn)生的原因就是數(shù)據(jù)庫的獨(dú)占式封鎖機(jī)制,當(dāng)執(zhí)行DML語句時(shí)對(duì)表或行數(shù)據(jù)進(jìn)行鎖住,直到事務(wù)提交或回滾或者強(qiáng)制結(jié)束當(dāng)前會(huì)話。
對(duì)于我們的應(yīng)用系統(tǒng)而言鎖表大概率會(huì)發(fā)生在SQL執(zhí)行慢并且沒有超時(shí)的地方(一條SQL由于某種原因(Spoon工具做數(shù)據(jù)抽取與推送)一直執(zhí)行不成功并且一直不釋放資源)因此寫出高效率SQL也尤為重要!還有另外情況也會(huì)發(fā)生鎖表,就是高并發(fā)場景,高并發(fā)會(huì)帶來的問題就是Spring事務(wù)會(huì)造成數(shù)據(jù)庫事務(wù)未提交產(chǎn)生死鎖(當(dāng)前事務(wù)等待其他事務(wù)釋放鎖資源)!從而拋出異常java.sql.SQLException: Lock wait timeout exceeded;。
那么如何解決鎖表或鎖超時(shí)呢?臨時(shí)性解決方案就是找出鎖資源競爭的表或語句,直接結(jié)束當(dāng)前會(huì)話或sesstion,強(qiáng)制釋放鎖資源。例如
解決方法如下:
1、session1修改某條數(shù)據(jù)但是不提交事務(wù),session2查詢未提交事務(wù)的那條記錄
2、session2嘗試修改
我們可以看到修改未提交事務(wù)的記錄會(huì)處于一直等待狀態(tài),直到對(duì)方釋放鎖資源或強(qiáng)制關(guān)閉session1。這里也說明了Oracle做到了行級(jí)鎖!
這里只是簡單的模擬了出現(xiàn)鎖表情況,可以一眼看出就是session1導(dǎo)致的鎖表。實(shí)際開發(fā)中遇到這種情況一般都是使用SQL直接查出鎖資源競爭的表或語句然后進(jìn)行資源的強(qiáng)制釋放?。?/p>
3、session3查詢競爭資源的表或語句,強(qiáng)制釋放資源
-- 查詢未提交事務(wù)的session信息,注意執(zhí)行以下SQL,用戶需要有DBA權(quán)限才行 SELECT L.SESSION_ID, S.SERIAL#, L.LOCKED_MODE AS 鎖模式, L.ORACLE_USERNAME AS 所有者, L.OS_USER_NAME AS 登錄系統(tǒng)用戶名, S.MACHINE AS 系統(tǒng)名, S.TERMINAL AS 終端用戶名, O.OBJECT_NAME AS 被鎖表對(duì)象名, S.LOGON_TIME AS 登錄數(shù)據(jù)庫時(shí)間 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
查詢結(jié)果如下
對(duì)我們強(qiáng)制釋放資源有用的只有前面兩個(gè)字段,例如
-- 強(qiáng)制 結(jié)束/kill 鎖表會(huì)話語法 ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#'; -- 強(qiáng)制殺死session1,讓session2可以修改id=5的那條記錄 ALTER SYSTEM KILL SESSION '34, 111';
強(qiáng)制殺死session1后,注意觀察session2的執(zhí)行情況!我們會(huì)發(fā)現(xiàn)session2的等待會(huì)立即終止并執(zhí)行!相信小伙伴們都有一個(gè)疑惑,session_id有29和34,如何確定他們屬于session1還是session2,保證殺死的是session1讓session2成功執(zhí)行DML語句?
其實(shí)也很簡單,這里的判斷方式就是session1執(zhí)行更新但不提交事務(wù),可先用以上SQL查詢未提交事務(wù)的session信息,此時(shí)查到的就是session1的信息。
總結(jié)
到此這篇關(guān)于Oracle鎖表解決的文章就介紹到這了,更多相關(guān)Oracle鎖表解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
隨機(jī)獲取oracle數(shù)據(jù)庫中的任意一行數(shù)據(jù)(rownum)示例介紹
對(duì)于rownum來說它是oracle系統(tǒng)順序分配為從查詢返回的行的編號(hào),返回的第一行分配的是1,第二行是2,依此類推,這個(gè)偽字段可以用于限制查詢返回的總行數(shù),且rownum不能以任何表的名稱作為前綴2014-07-07實(shí)例講解臨時(shí)處理去重 80w 數(shù)據(jù)時(shí)夯死現(xiàn)象
這篇文章主要介紹了臨時(shí)處理去重 80w 數(shù)據(jù)時(shí)夯死現(xiàn)象,需要的朋友可以參考下2015-09-09win平臺(tái)oracle rman備份和刪除dg備庫歸檔日志腳本
本文介紹win平臺(tái)oracle rman備份和刪除dg備庫歸檔日志腳本2013-11-11Oracle收購TimesTen 提高數(shù)據(jù)庫軟件性能
Oracle收購TimesTen 提高數(shù)據(jù)庫軟件性能...2007-03-03Oracle導(dǎo)出文本文件的三種方法(spool,UTL_FILE,sqluldr2)
這篇文章主要介紹了Oracle導(dǎo)出文本文件的三種方法(spool,UTL_FILE,sqluldr2),需要的朋友可以參考下2023-05-05oracle SCN跟TIMESTAMP之間轉(zhuǎn)換
本文將詳細(xì)介紹oracle SCN跟TIMESTAMP之間轉(zhuǎn)換,需要的朋友可以參考下2012-11-11