數據庫表被鎖的原因分析和數據庫亂碼解決

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

事故的背景:

當所以功能開發完成後,開發人員在本地進行了測視已經沒問題了。就把所有開發的功能模塊合併到 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 重啓即可。

二、在做 javaweb 項目的時,前臺傳遞的中文最後插入數據庫的時候總是出現亂碼現象。

解決方案

A、不管是使用 Idea、eclipse,確定自己的項目所使用的字符集是 UTF-8

B、查看 MySQL的字符集是否是 UTF-8。打開 Dos 窗口,輸入:mysql -u root -p, 在輸入密碼即可進入 數據庫。進入數據庫輸入命令 :show variables like 'character%';查看數據庫的字符集,如下圖:

1.png

MySQL 的默認編碼是 Latin1,不支持中文,要支持中文需要把數據庫的默認編碼修改爲 UTF-8

C、修改 MySQL 的字符集。

① 使用命令修改數據庫的字符集爲 UTF-8。(由於小編使用命令設置後依舊不能插入,不在此贅述)

② 修改 MySQL 的配置文件。(修改後,成功插入中文,在此介紹這種方法)

D、本人安裝的 MySQL 版本是 5.7.25,安裝好 MySQL 後就要對字符集進行修改了,網上的大部分說法是去 安裝目錄找一個 my-default.ini 文件,然後重命名爲 my.ini,再對其進修改字符集即可,但是 在 MySQL 的安裝目錄下居然沒有這個文件。

其實 MySQL 的 5.7.25 的 my.ini文件不在安裝目錄下,如果是默認安裝 MySQL 的,那麼它的 my.ini 文 件在隱藏文件夾 C:\ProgramData\MySQL\MySQL Server 5.7 下。

你需要做的就是顯示隱藏的的項目,找到這個文件修改即可(修改前,請先做備份)。

對該 my.ini 文件下進行配置修改 :

[client]

default-character-set = utf8

[mysql]

default-character-set = utf8

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8

collation-server = utf8_unicode_ci

init_connect=’SET NAMES utf8’

E、修改 my.ini 文件後,保存,再重啓 MySQL 服務。

計算機——右鍵——管理——服務,找到 MySQL57,對其右鍵停止,再啓動即可

F、重啓成功後,進入 MySQL 數據庫,輸入show variables like 'character%'; 顯示數據庫字符集已修改 成功。

2.png

重要提示:

對於中文亂碼問題,小編只是列舉了一種可能性,以及解決方案。當然最重要的是肯定還有很多原因導致中文亂碼,都會有相應的解決方案。作爲程序猿,應當懂得 google,正所謂自己動手,豐衣足食。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章