首頁  >  文章  >  資料庫  >  mysql什麼情況下會死鎖

mysql什麼情況下會死鎖

(*-*)浩
(*-*)浩原創
2019-05-08 11:07:063915瀏覽

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

推薦課程:MySQL教學

mysql什麼情況下會死鎖

死鎖的關鍵在於:兩個(或以上)的Session加鎖的順序不一致。

那麼對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序

#案例

##需求:將投資的錢拆成幾份隨機分配給借款人。


起初業務程序思路是這樣的:


投資人投資後,將金額隨機分成幾份,然後隨機從借款人表裡選幾個,然後透過一條條select for update 去更新借款人表裡面的餘額等。


例如兩個用戶同時投資,A用戶金額隨機分成2份,分給借款人1,2


B用戶金額隨機分成2份,分給借款人2,1


由於加鎖的順序不一樣,死鎖當然很快就出現了。 


對於這個問題的改進很簡單,直接把所有被分配到的借款人直接一次鎖住就行了。


Select * from xxx where id in (xx,xx,xx) for update


在in裡面的列表值mysql是會自動從小到大排序,加鎖也是一條從小到大加的鎖


 例如(以下会话id为主键):
 
Session1:
 
mysql> select * from t3 where id in (8,9) for update;
+----+--------+------+---------------------+
| id | course | name | ctime               |
+----+--------+------+---------------------+
|  8 | WA     | f    | 2016-03-02 11:36:30 |
|  9 | JX     | f    | 2016-03-01 11:36:30 |
+----+--------+------+---------------------+
rows in set (0.04 sec)
 
 
Session2:
select * from t3 where id in (10,8,5) for update;
锁等待中……
 
其实这个时候id=10这条记录没有被锁住的,但id=5的记录已经被锁住了,锁的等待在id=8的这里
不信请看
 
Session3:
mysql> select * from t3 where id=5 for update;
锁等待中
 
 
Session4:
mysql> select * from t3 where id=10 for update;
+----+--------+------+---------------------+
| id | course | name | ctime               |
+----+--------+------+---------------------+
| 10 | JB     | g    | 2016-03-10 11:45:05 |
+----+--------+------+---------------------+
row in set (0.00 sec)
 
 
在其它session中id=5是加不了锁的,但是id=10是可以加上锁的。

以上是mysql什麼情況下會死鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn