共計 1508 個字符,預計需要花費 4 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章將為大家詳細講解有關 mysql 如何產生死鎖的,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
mysql 中死鎖 DeadLock:是指兩個或兩個以上的進程在執行過程中, 因爭奪資源而造成的一種互相等待的現象, 若無外力作用,它們都將無法推進下去. 此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。表級鎖不會產生死鎖. 所以解決死鎖主要還是針對于最常用的 InnoDB。
死鎖的關鍵在于:兩個 (或以上) 的 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 如何產生死鎖的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!