次の例外に直面しています:
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
私が言えることは、複数のスレッドが同じテーブルに対して並行してクエリを実行していることです。しかし、なぜこの例外が発生するのか理解できません。あるクエリがテーブルをロックした場合、別のスレッドの同じクエリ (または同じテーブルの他のクエリ) がロックを待機するためです。デッドロックが発生するのはなぜですか?
別の言葉で繰り返しますが、例外は理解していますが、理解できないのは、クエリが他のクエリを待機しており、他のクエリが実行され、ロックを離れ、待機中のクエリがロックを取得できるということです。なぜデッドロックなのですか?
誰かが実際のクエリを見たい場合 (これらのクエリは、トランザクションなしで、ここに印刷されているのと同じ順序で複数のスレッドで実行されます):
UPDATE daily_stats, account, campaign SET campaign_messages_cost = campaign_messages_cost + (IF(current_free_sms >= ?, campaign.campaign_cost, campaign.campaign_cost + (account.sms_charging_rate * ? ))), campaign_messages_delivered_count = campaign_messages_delivered_count + 1 WHERE daily_stats_id = ? AND campaign.id = ? AND daily_stats.account_id = account.id
update account a JOIN campaign b ON a.id = b.account_id set campaign_cost = IF(current_free_sms >= ?, campaign_cost, campaign_cost + (a.sms_charging_rate * ? )), delivered_count = delivered_count + ?, credit = IF(current_free_sms >= ?, credit, credit - (a.sms_charging_rate * ?)), current_free_sms = IF (current_free_sms >= ?, current_free_sms - ?, current_free_sms) where b.id = ?