msyql 併發批量跑 update語句 但按順序跑的,且每一批都加了redis鎖為什麼會出現死鎖?

時間 2022-01-06 13:07:12

1樓:哈里斯

多個事務間有修改相同的記錄時,就會有死鎖;

比如事務A :

update A set colum1 = '1' where colum2='a'; (語句1: 執行時間00)

update A set colum1 = '2' where colum2='b'; (語句2: 執行時間 02)

事務B:

當出現這種情況時:A先獲取a的鎖,事務B獲取b行的鎖;事務A等待b的鎖,事務B等待a的鎖,產生死鎖

注意:事務是在提交完才會釋放所有鎖的,所以事務裡面不能有太多的語句,不應該併發多個事務批量修改

2樓:寇亞龍

你的sql 和你舉的例子不一樣,差別很大

首先你用explain 分別看一下,B表在沒有name age no的組合索引和有name age no的組合索引兩種情況下 update B set amt=amt+5 where name='張三' and age='10' and no='2' and id='1';這個sql使用了哪個索引。

其次你得明白,mysql innodb儲存引擎叫做索引組織表,不管是行鎖、間隙鎖、表鎖都是鎖的索引。

最後具體死鎖的產生的話,其實就是併發跑的過程中,如果第一批的update B set amt=amt+5 where name='張三' and age='10' and no='2' and id='1';和第二批的update B set amt=amt+5 where name='張三' and age='10' and no='2' and id='1'; 鎖的範圍發生了重疊,然後兩個都會等對方釋放,就是死鎖了。

根據你說的加了組合索引之後就不會有死鎖,那說明update B set amt=amt+5 where name='張三' and age='10' and no='2' and id='1';這個sql大概率在更新的時候是表鎖。所以建表時候索引很重要

如何理解 程式 程序 執行緒 併發 並行 高併發?

大魚 這篇文章講得挺細的,可以看看https markdowner.net article 142723313666699264 zhang 單程序 包含多個磁碟讀寫請求 IO 非併發 單程序單執行緒同步 說明 乙個程序,多個請求同步執行,請求阻塞說明 同一時間段只執行乙個請求 併發 單程序 單執行...

責任免除及其併發症 併發症有哪些?

趙勇 1.該不該續保,具體情況具體分析。如果其他公司的醫療險結果是相同的,那就繼續投保就好,如果進行了如實告知其他公司有標體或者更好的承保結果甚至有更好的產品,那當然應該選擇更好的。但醫療險是所有險種中核保最為嚴格的,這樣的核保結果很正常。免責了泌尿繫結石及其併發症,其他方面依然可以保障,依然是十分...

高併發insert ignore是選擇innodb還是myisam?

刀尖紅葉 TokuDB 它的fractal tree 其實就是buffered tree 能把隨機IO變為順序IO,寫入效能極強,我們測試在HDD是InnoDB的3倍以上 Myisam官方已經放棄維護了,雖然插入效能也行,但不是crash safe且crash後恢復時間長,而且只有索引能快取在記憶體...