2017-08-30 5 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

3-4正常に実行した後、デッドロックの原因となるこの挿入... select文。

助けてください。 MySQLで「最後のデッドロックログ」を表示するには?

私はこの

トランザクション1のような何かやりたい - >挿入行

トランザクション2 - - >クエリ上で評価する - >クエリ上で評価>挿入行

ここで、2番目のトランザクションがクエリを評価するとき、以前のトランザクションによって挿入されたデータを考慮する必要があります。ここでは、最大4トランザクションで行を挿入できるようにしたいと考えています。したがって、評価されたクエリでは、挿入だけが可能です。

クエリの評価と挿入の2つのプロセスが別々であり、以前のトランザクションデータを考慮しない場合、4トランザクション以上が来てデータを挿入できます。 1つのトランザクションを開始し、読み取ったデータを、条件を満たし、その後誰も挿入をしない間にデータを挿入し、意味、および最初のトランザクションとして完全な場合

だから、究極の目標は、2番目のトランザクションがあり、

にありますすべての更新されたデータのみを考慮する。したがって、1つのトランザクションに対しては完了しても何もせず、他のトランザクションは待機する必要があります。 私は同時にすべてのデータを読み込むので、並行要求では達成されないため、すべてのデータがテーブルにデータを追加できるように古いデータを読み込みます。 この全体を1つのクエリで取ります。

+0

あなたは 'md_waiting_slot_count'に挿入すると同時に、挿入中にこのテーブルから選択します。さらに、この表を更新することもあります。私の推測では、この構造はデッドロックの原因です。この方法で挿入をやりなおすことはできますか? –

+0

あなたはすべての異なる番号とタイプの列1です:select cell、 '2017-08-31' as 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

他の次のトランザクションのために選択クエリで使用したいので、別の一時テーブルにデータを挿入できません。 –

関連する問題