聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

環球熱頭條丨java中的死鎖如何優化?mysql之鎖優化

來源:CSDN 時間:2023-04-10 08:41:52

文章目錄


(資料圖片僅供參考)

前言語句層面死鎖如何安全地給小表加字段總結

前言

之前的文章,我們對鎖的種類,和鎖的一些用途,進行了簡單的講解。今天我們將接著上張的內容,對鎖的優化進行介紹。

語句層面

首先,我們從語句層面介紹下怎么進行鎖優化。之前的文章我們介紹過,鎖實在sql執行的時候才會加鎖。但是鎖的釋放,卻是在事務提交之后,才會釋放。這樣就會帶來一個問題。如下圖 假如,這是一個電影院的一個購票業務。電影院叫b,客戶為a,a想在b買一張電影票,上圖則是一個完整的買票流程。然后這個時候,c也想從電影院買張票,那么c和a沖突的地方就是第二條語句。如果我們把第二條語句放在最后,那么a和c沖突的時間是不是就會縮短。因為鎖是在最后事務提交的時候才會釋放,那么放在最后執行沖突語句,鎖持續的時間就是最短的。這樣就可以減少鎖的時間,減少并發沖突的時間。

死鎖

說起死鎖,相必大家都不會陌生,因為這個在java中也是十分的常見的。產生死鎖的原因就是雙方互相占有對方所需要的的互斥資源,且短時間內,不會釋放。那么從這個描述上呢,我們基本可以有四種解決方法。但是在mysql中呢,大致有兩種解決方法。因為mysql中的鎖不會像java中的鎖,那么便于操作。如下圖 事務a和事務b相互需要對方的行鎖,導致死鎖的產生。這個時候大致有兩種策略。 1.直接進入等待,直到超時,這個超時的參數可以自己設置。 2.死鎖檢測,檢測到這個死鎖,然后對其中一個事務進行回滾,釋放出另一個事務需要的鎖,以便兩個語句都能進行下去。 但是開啟死鎖檢測是十分的消耗性能的,比如一千個事務同時更新同一行數據,那么死鎖基本要檢測1000x1000行數據,消耗太大。 那遇到這種熱點表怎么辦呢,最好的辦法就是控制并發,可以用一個隊列(不管是在數據庫中實現,還是依靠消息中間件實現,都可以),讓進來的事務進行排隊,同一時間至多有10個,或者20個可以對這行數據進行修改,這樣就可以很好的實現并發修改了。

如何安全地給小表加字段

首先我們要解決長事務,事務不提交,就會一直占著 MDL 鎖。在 MySQL 的 information_schema 庫的 innodb_trx 表中,你可以查到當前執行中的事務。如果你要做 DDL 變更的表剛好有長事務在執行,要考慮先暫停 DDL,或者 kill 掉這個長事務。但考慮一下這個場景。如果你要變更的表是一個熱點表,雖然數據量不大,但是上面的請求很頻繁,而你不得不加個字段,你該怎么做呢?這時候 kill 可能未必管用,因為新的請求馬上就來了。比較理想的機制是,在 alter table 語句里面設定等待時間,如果在這個指定的等待時間里面能夠拿到 MDL 寫鎖最好,拿不到也不要阻塞后面的業務語句,先放棄。之后開發人員或者 DBA 再通過重試命令重復這個過程。

總結

今天我們繼續上篇文章,對鎖的優化進行了講解,但是只是在語句層面進行大致的講解。同時也介紹的死鎖的出現原因,和怎么避免死鎖的方法。

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线