網站首頁 編程語言 正文
前言
鎖表或鎖超時相信大家都不陌生,經常發生在DML語句中,產生的原因就是數據庫的獨占式封鎖機制,當執行DML語句時對表或行數據進行鎖住,直到事務提交或回滾或者強制結束當前會話。
對于我們的應用系統而言鎖表大概率會發生在SQL執行慢并且沒有超時的地方(一條SQL由于某種原因(Spoon工具做數據抽取與推送)一直執行不成功并且一直不釋放資源)因此寫出高效率SQL也尤為重要!還有另外情況也會發生鎖表,就是高并發場景,高并發會帶來的問題就是Spring事務會造成數據庫事務未提交產生死鎖(當前事務等待其他事務釋放鎖資源)!從而拋出異常java.sql.SQLException: Lock wait timeout exceeded;。
那么如何解決鎖表或鎖超時呢?臨時性解決方案就是找出鎖資源競爭的表或語句,直接結束當前會話或sesstion,強制釋放鎖資源。例如
解決方法如下:
1、session1修改某條數據但是不提交事務,session2查詢未提交事務的那條記錄
2、session2嘗試修改
我們可以看到修改未提交事務的記錄會處于一直等待狀態,直到對方釋放鎖資源或強制關閉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
查詢結果如下
對我們強制釋放資源有用的只有前面兩個字段,例如
-- 強制 結束/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的信息。
總結
原文鏈接:https://blog.csdn.net/m0_46357847/article/details/123648469
相關推薦
- 2022-07-21 配置nacos持久化
- 2022-05-31 Python中的列表及其操作方法_python
- 2022-05-19 python?字符串常用方法超詳細梳理總結_python
- 2022-10-26 Google?Kubernetes?Engine?集群實戰詳解_云其它
- 2022-04-22 electron設置最小大小和最大大小
- 2022-04-25 淺談Golang?Slice切片如何擴容的實現_Golang
- 2022-03-09 SQL數據庫語句大全_數據庫其它
- 2022-10-16 Python?讀取?Word?文檔操作_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支