mysql兩個事務執行相同語句導致Deadlock

2021-08-19 13:23:45 字數 875 閱讀 9773

伺服器通訊時,sql語句發生了deadlock問題,使用事務操作包含相同的update語句導致的deadlock,整了很長一段時間,記錄一下。

前提:1:事務a和事務b,在不同執行緒中,輪詢呼叫使用函式封裝的update語句

2:表結構中包含兩個欄位table_name、user_id,並且將這兩個字段設定為唯一索引。

發生錯誤現象:通過日誌以及語句:show engine innodb status\g,檢視發生發生deadlock現象;

發生問題原因:1.執行緒a開啟事務,並update某乙個資料,由於table_name、user_id兩字段是唯一索引,因此會開啟行級鎖。

2.執行緒b開啟事務,同時update這張表,並開啟相應行級鎖。

3.兩個執行緒開啟的事務中,都包含輪詢操作。假定第一次執行緒a鎖定行數1,執行緒b鎖定行數2;接著第二次執行緒a鎖定行數2,此時會出現等待,若同時現場執行緒b嘗試更新行數1,則會發生死鎖現象;如下兩張圖:

執行緒1(輪詢語句寫在begin和commit之間,執行緒1更新表raw_key_5後不進行commit,但此時執行緒2搶奪了資源,並更新了表raw_key_4,當執行緒2接下去操作raw_key_5時會出現等待,而當執行緒1再次拿到資源後更新表raw_key_4時就會報deadlock):

執行緒2:

解決方案:1.將事務執行範圍縮小。

2.刪除相關唯一索引,將鎖範圍擴大至表級鎖。

3.修改更新語句,將查詢條件擴大化,將鎖範圍擴大至表級鎖。

同時執行兩個版本相同的tomcat

由於專案需要,集群和乙個節點都部署在本地,那麼就需要有兩個tomcat,乙個部署集群,乙個部署專案,我都用了7.0.34版本的tomcat 當啟動 的tomcat成功時,再啟動節點的tomcat執行了一下會自己閃退 當啟動節點的tomcat成功時,再啟動 的的tomcat也出現了執行一下就閃退的問題...

adb shell 連線兩個相同裝置

當電腦連線了兩個相同型號的安卓裝置 例 hw obu 使用adb shell 時,adb devices 發現兩個裝置名稱一致,導致無法連線.1 先只連線乙個obu,adb shell 進入裝置 echo obu1 sys class android usb android0 iserial改名為 ...

同時執行兩個mysql例項

1.修改 etc mysql my.cnf 加入 mysqld multi mysqld usr bin mysqld safe mysqladmin usr bin mysqladmin user multi admin password multipass 把原來的 mysqld 改成 mysq...