2017-08-30 117 views
0

MySQL版本5.7 引擎:InnoDB的MySQL的INSERT ... SELECT語句中的併發請求導致死鎖

我已經表稱爲 「md_waiting_slot_count」,它具有以下的列:

cell | popupDate | userId | creationTime 

現在我有以下查詢:

insert into md_waiting_slot_count 
select cell, '2017-08-31' as pd, 'abnc' as ui, '2017-08-26 15:55:51' 
from 
(select sum(slotcount) as tt, cell from 
(select 0 as slotcount, cell_str as cell, 'master' from cell where 
cell_str in 
("Gujarat_Jamnagar_Jamnagar_00-18_Male","Gujarat_Jamnagar_Jamnagar_19- 
22_Male") 

union all 

select slotcount, cell, wting from 
(select count(*) as slotcount, cell as cell, 'waiting' as wting from 
md_waiting_slot_count where 
cell in(SELECT cell_str as cell FROM cell where cell_str 
in("Gujarat_Jamnagar_Jamnagar_00-18_Male","Gujarat_Jamnagar_Jamnagar_19- 
22_Male")) 
and popupDate='2017-08-31' and creationTime > DATE_SUB(NOW(), INTERVAL 
20 MINUTE) group by cell) as t1 

union all 

select filledslotcount as slotcount, id as cell, 'final' from 
md_slot_count where id in(
SELECT cell_str as cell FROM cell where cell_str 
in("Gujarat_Jamnagar_Jamnagar_00-18_Male","Gujarat_Jamnagar_Jamnagar_19- 
22_Male")) 
and popupSlotDate='2017-08-31') t group by cell having tt < 4) as ft 
order by cell, pd, ui 
on duplicate key update creationTime = "'2017-08-26 15:55:51'"; 

這裏2其他表也使用其是作爲遵循

md_slot_count id| popupDate| state| district| taluka| ageGroup| gender| filledSlotCount

cell cell_str| state| district| taluka| ageGroup| gender

這INSERT ... SELECT語句後3-4成功運行造成的僵局。

幫我看看這個。 如何查看MySQL中的「上一個死鎖日誌」?

我想要做這樣的事情

事務1 - >上面的查詢評估 - >插入行

交易2 - >評估上面的查詢 - >插入行

這裏,當第二個事務評估查詢時,它必須考慮先前事務插入的數據。在這裏,我想允許最大4個事務插入行,不超過。所以評估的查詢允許插入然後只插入。

現在在並行請求中,如果查詢評估和插入的這兩個過程是分開的並且不考慮以前的事務數據,那麼超過4個事務可以來插入數據。

所以,最終的目標是

如果一個交易開始和讀取數據,並滿足條件,那麼插入數據和平均值,而沒有其他人做的插入,而作爲第一筆交易完成後,第二次交易有隻考慮所有更新的數據。因此,對於一個交易和其他交易必須等待完成或者完全沒有。 我並沒有在併發請求中實現,因爲它們全部一起讀取,因此它讀取舊數據,因此所有可以在表中添加數據。 所以我把這個整體放在一個查詢中。

+0

您正在插入'md_waiting_slot_count'並同時在插入過程中從此表中進行選擇。最重要的是,有時您會對此表進行更新。我的猜測是這個結構是死鎖的來源。有沒有什麼辦法可以避免這樣插入? –

+0

你是聯盟所有不同數量和類型的第1列:選擇單元格'2017-08-31'作爲pd'abnc'as ui'2017-08-26 15:55:51'2:select slotcount,cell ,wting ..確定這個查詢工作?????? – scaisEdge

+0

@Tim Biegeleisen我這樣做是因爲我想插入只有當選擇查詢評估成功和返回行,否則不行。如果這些是2個單獨的查詢,那麼在併發請求中它插入多於4行,我在上面的查詢中提到了子句。這個單獨的聲明不適用於併發請求。 –

回答

0

您想插入md_waiting_slot_count從md_waiting_slot_count計算出的一些數據。 所以死鎖是不可避免的。嘗試創建一個包含您的值的臨時表,然後從臨時表中插入您的值。

+0

我無法在另一個臨時表中插入數據,因爲我想在下一個事務的波紋管選擇查詢中使用它。 –