Oracle 、MySql 數據庫表被鎖的原因分析


記錄一次准備給客戶預演示出現的問題

事故的背景:

當所以功能開發完成后,開發人員在本地進行了測視已經沒問題了。就把所有開發的功能模塊合並到 dev 分支,進行打包,發布到預演示的線上環境。當在給相關人員進行演示的時候,出現了問題。

我們使用 https 調用對方的接口發送 Json 數據,對方進行校驗馬上返回校驗的響應結果。問題出現在我們每次發送數據都是成功的,但是對方發送回來的數據,一直不能正常插入 DB(使用的是 Oracle)

事故的真正原因:

因為有個同事在進行了 delete 后沒有進行 commit 提交。導致表一直被鎖住,不能被其他人使用。

但是殺死進程和本地 commit 幾次后,依舊無法插入數據,提示還是 DB 被這個同事鎖住。

最后查出的真正原因是,這個同事首先使用了 無線網絡 進行了 DB 的操作,當時並沒有 commit 提交操作。而后又插上網線繼續工作,問題就出現在這里。

首先,當我們使用無線網絡操作 DB 時,Oracle 會默認這是一次會話(session),當開發人員對 DB 進行操作后(沒有 commit ),又切換到了有線網絡狀態下,而這 2 種狀態下的本機 IP 是不一樣的(有興趣的朋友可以試試使用無線和有線連接狀態下,同一台電腦的 IP 地址是否一樣)。

Oracle 會認為第一次 session 沒有關閉,會將表鎖住,等待這次 session 會話的提交直到結束。

所以當同事再連接上網線,使用有線網絡進行 commit 時候會提示操作失敗。因為 Oracle 數據庫認為這又是一次新的 session 會話。而第一次的 session 會話並沒有結束,就會導致出現了 DB 一直被鎖的情況。

事故的解決辦法:

首先使用語句查詢(只有 Admin 用戶才可以)出被鎖住的表和鎖表的開發人員的工號。

然后殺死這個進程或者進行 DB 重啟即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM