Vote #74839
完了Deadlock when delete issues in same time on multiple sessions
0%
説明
Dear team,
When we have multiple sessions try to delete issues in same times, we encounter this internal error:
ActiveRecord::StatementInvalid (Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction: SELECT
issues.* FROMissuesWHEREissues.root_id= 145786 AND (issues.lft>= 1 ANDissues.rgt<= 2) AND (issues.id != 145786) ORDER BYissues.lft):
The trace:
Started DELETE "/issues/17669" for 127.0.0.1 at 2014-01-23 16:34:09 +0700
Processing by IssuesController#destroy as HTML
Parameters: {"authenticity_token"=>"tlayCB7PIEzTrauenLr7g4HoeWkjz6S43YG6tZBRQE0=", "id"=>"17669"}
(3.0ms) SELECT MAX(settings.updated_on) AS max_id FROMsettings
User Load (3.0ms) SELECTusers.* FROMusersWHEREusers.typeIN ('User', 'AnonymousUser') ANDusers.status= 1 ANDusers.id= 1454 LIMIT 1
Current user: ttanthanh (id=1454)
Issue Load (3.0ms) SELECTissues.* FROMissuesWHEREissues.id= 17669
Project Load (2.0ms) SELECTprojects.* FROMprojectsWHEREprojects.id= 10 LIMIT 1
EnabledModule Load (3.0ms) SELECT name FROMenabled_modulesWHEREenabled_modules.project_id= 10
(2.0ms) SELECT SUM(time_entries.hours) AS sum_id FROMtime_entriesWHERE (issue_id IN (17669))
Issue Load (4.0ms) SELECTissues.* FROMissuesWHEREissues.id= 17669 LIMIT 1
(2.0ms) BEGIN
Journal Load (3.0ms) SELECTjournals.* FROMjournalsWHEREjournals.journalized_id= 17669 ANDjournals.journalized_type= 'Issue'
SQL (2.0ms) DELETE FROMjournal_detailsWHEREjournal_details.journal_id= 343792
SQL (3.0ms) DELETE FROMjournalsWHEREjournals.id= 343792
SQL (2.0ms) DELETE FROMtime_entriesWHEREtime_entries.issue_id= 17669
SQL (2.0ms) DELETE FROMissue_relationsWHEREissue_relations.issue_from_id= 17669
SQL (3.0ms) DELETE FROMissue_relationsWHEREissue_relations.issue_to_id= 17669
Issue Load (2.0ms) SELECTlft,rgt,parent_idFROMissuesWHEREissues.id= 17669 LIMIT 1 FOR UPDATE
Issue Load (725.0ms) SELECT id FROMissuesWHERE (lft>= 1) FOR UPDATE
Issue Load (3.0ms) SELECTissues.* FROMissuesWHEREissues.root_id= 17669 AND (issues.lft>= 1 ANDissues.rgt<= 2) AND (issues.id != 17669) ORDER BYissues.lft
SQL (3.0ms) UPDATEissuesSETlft= (lft- 2) WHEREissues.root_id= 17669 AND (lft> 2) ORDER BYissues.lft
SQL (2.0ms) UPDATEissuesSETrgt= (rgt- 2) WHEREissues.root_id= 17669 AND (rgt> 2) ORDER BYissues.lft
Issue Load (4.0ms) SELECTissues.* FROMissuesWHEREissues.id= 17669 LIMIT 1
Attachment Load (3.0ms) SELECTattachments.* FROMattachmentsWHEREattachments.container_id= 17669 ANDattachments.container_type= 'Issue' ORDER BY attachments.created_on ASC, attachments.id ASC
SQL (5.0ms) DELETE FROMcustom_valuesWHEREcustom_values.customized_id= 17669 ANDcustom_values.customized_type= 'Issue'
SQL (2.0ms) DELETE FROMwatchersWHEREwatchers.watchable_id= 17669 ANDwatchers.watchable_type= 'Issue'
Changeset Load (10.0ms) SELECTchangesets.* FROMchangesetsINNER JOINchangesets_issuesONchangesets.id=changesets_issues.changeset_idWHEREchangesets_issues.issue_id= 17669 ORDER BY changesets.committed_on ASC, changesets.id ASC
SQL (3.0ms) DELETE FROMissuesWHERE (issues.id= 17669 ANDissues.lock_version= 1)
(9.0ms) COMMIT
Redirected to http://localhost:3001/projects/demoproject/issues
Completed 302 Found in 36813ms (ActiveRecord: 808.0ms)
We have two lines may be cause deadlock (I guess that)
Issue Load (725.0ms) SELECT id FROM
issuesWHERE (lft>= 1) FOR UPDATE
This query lock table and cost too much time.Issue Load (3.0ms) SELECT
issues.* FROMissuesWHEREissues.root_id= 17669 AND (issues.lft>= 1 ANDissues.rgt<= 2) AND (issues.id != 17669) ORDER BYissues.lft
And this query always return empty result.
Thanks for your support.
journals
This was fixed in r12445 for 2.5.0. Only the deleted issues are now locked:
<pre>
SELECT id FROM `issues` WHERE `issues`.`root_id` = 13167 AND (`lft` >= 1) ORDER BY `issues`.`lft` FOR UPDATE
</pre>
instead of:
<pre>
SELECT id FROM `issues` WHERE (`lft` >= 1) FOR UPDATE
</pre>
--------------------------------------------------------------------------------