1. 程式人生 > >mysql的插表以及更新操作導致的死鎖問題

mysql的插表以及更新操作導致的死鎖問題



一.mysql的死鎖: 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的InnoDB;

二..開發過程中碰到的場景:

1.為了提高儲存過程查詢速度的效率,在一張表(A)的status中新增了一個普通索引;

2.整個過程大致兩個過程:

a.內部處理把表A中status為'3'的資料先鎖住(主要是防止併發訪問),外部一直進行表的插入操作,插入的status也為‘3’',在該過程中產生了死鎖現象;

3.通過mysq查詢死鎖語句:show engine innodb status,查詢死鎖的原因,

三.問題原因分析:InnoDB行鎖是通過給索引上的索引項加鎖來實現的,

四.通過兩個視窗模擬測試;

1.

SET autocommit=0;

SELECT * FROM t1  WHERE STATUS='1' FOR UPDATE;   // 在MySQL中,行級鎖並不是直接鎖記錄,而是鎖索引

2.insert into t1 (id ,status) valus ('100032','1');  //在1沒有提交前,無法進行提交

【注:insert into t1 (id ,status) valus ('100032','2');  //是可以提交成功的】

四.解決

1.因為狀態的業務已經確認,插入的狀態跟狀態的狀態需要一致,後來還是把staus的索引去掉,犧牲一部分效能來解決死鎖的問題。

查考資料: