| Bug #58988 | InnoDB Deadlock on SELECT - no FOR UPDATE or LOCK IN SHARE MODE clause | ||
|---|---|---|---|
| Submitted: | 16 Dec 2010 22:18 | Modified: | 17 Dec 2010 20:59 |
| Reporter: | Paula Wing | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
| Version: | 5.1.41-3ubuntu12.8-log | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | deadlock, innodb | ||
[16 Dec 2010 22:18]
Paula Wing
[16 Dec 2010 22:19]
Paula Wing
------------------------
LATEST DETECTED DEADLOCK
------------------------
101216 14:06:12
*** (1) TRANSACTION:
TRANSACTION 0 6584119, ACTIVE 0 sec, process no 30732, OS thread id 139683681998608 starting index read
mysql tables in use 8, locked 5
LOCK WAIT 14 lock struct(s), heap size 3024, 34 row lock(s)
MySQL thread id 4009, query id 8153649 localhost 127.0.0.1 mhs Sending data
SELECT /*TaskConsistency-product*/ * FROM (SELECT p.product_id, p.available_quantity as p_available_quantity, p.unavailable_quantity as p_unavailable_quantity, ifnull((SELECT sum(gpm.available_quantity) FROM goo_product_map gpm JOIN goo g ON (g.goo_id = gpm.goo_id AND g.goo_type = 'P') JOIN pods on (g.pod_id = pods.pod_id and pods.status = 1) WHERE product_id = p.product_id), 0) as bin_quantity, ifnull((SELECT sum(milestones.untasked_quantity) from milestones JOIN jobs USING (job_id) where jobs.status = 2 and milestones.type IN ('G', 'R') and milestones.untasked_quantity != 0 AND (milestones.product_id = p.product_id)), 0) as p_untasked_quantity, p.pickable_quantity as p_pickable_quantity, pt.product_type_id, pt.available_quantity as pt_available_quantity, pt.pickable_quantity as pt_pickable_quantity, pt.unavailable_quantity as pt_unavailable_quantity FROM products p JOIN product_types pt USING (product_t
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 87821 page no 3 n bits 120 index `PRIMARY` of table `mhs`.`milestones` trx id 0 6584119 lock mode S locks rec but not gap waiting
Record lock, heap no 52 PHYSICAL RECORD: n_fields 26; compact format; info bits 0
0: len 4; hex 80000018; asc ;; 1: len 6; hex 000000647736; asc dw6;; 2: len 7; hex 00000000391e5f; asc 9 _;; 3: len 1; hex 53; asc S;; 4: len 4; hex 80000012; asc ;; 5: len 4; hex 80000001; asc ;; 6: len 4; hex 80000000; asc ;; 7: len 4; hex 80000001; asc ;; 8: len 1; hex 80; asc ;; 9: len 4; hex 80000001; asc ;; 10: len 4; hex 80000000; asc ;; 11: len 4; hex 80000001; asc ;; 12: len 1; hex 81; asc ;; 13: len 4; hex 80000002; asc ;; 14: len 4; hex 80000008; asc ;; 15: len 4; hex 80000000; asc ;; 16: SQL NULL; 17: SQL NULL; 18: len 4; hex 80000001; asc ;; 19: SQL NULL; 20: SQL NULL; 21: len 1; hex 81; asc ;; 22: len 4; hex 80000000; asc ;; 23: len 4; hex 80000004; asc ;; 24: len 4; hex 4b495641; asc KIVA;; 25: len 4; hex 80000003; asc ;;
*** (2) TRANSACTION:
TRANSACTION 0 6584118, ACTIVE 0 sec, process no 30732, OS thread id 139683682600720 updating or deleting, thread declared inside InnoDB 499
mysql tables in use 1, locked 1
14 lock struct(s), heap size 3024, 9 row lock(s), undo log entries 2
MySQL thread id 3998, query id 8153662 localhost 127.0.0.1 mhs Updating
UPDATE jobs SET time_closed = NOW(), status = 1 WHERE job_id = 18
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 87821 page no 3 n bits 120 index `PRIMARY` of table `mhs`.`milestones` trx id 0 6584118 lock_mode X locks rec but not gap
Record lock, heap no 52 PHYSICAL RECORD: n_fields 26; compact format; info bits 0
0: len 4; hex 80000018; asc ;; 1: len 6; hex 000000647736; asc dw6;; 2: len 7; hex 00000000391e5f; asc 9 _;; 3: len 1; hex 53; asc S;; 4: len 4; hex 80000012; asc ;; 5: len 4; hex 80000001; asc ;; 6: len 4; hex 80000000; asc ;; 7: len 4; hex 80000001; asc ;; 8: len 1; hex 80; asc ;; 9: len 4; hex 80000001; asc ;; 10: len 4; hex 80000000; asc ;; 11: len 4; hex 80000001; asc ;; 12: len 1; hex 81; asc ;; 13: len 4; hex 80000002; asc ;; 14: len 4; hex 80000008; asc ;; 15: len 4; hex 80000000; asc ;; 16: SQL NULL; 17: SQL NULL; 18: len 4; hex 80000001; asc ;; 19: SQL NULL; 20: SQL NULL; 21: len 1; hex 81; asc ;; 22: len 4; hex 80000000; asc ;; 23: len 4; hex 80000004; asc ;; 24: len 4; hex 4b495641; asc KIVA;; 25: len 4; hex 80000003; asc ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 87892 page no 12 n bits 96 index `status` of table `mhs`.`jobs` trx id 0 6584118 lock_mode X locks rec but not gap waiting
Record lock, heap no 23 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 80000002; asc ;; 1: len 4; hex 80000012; asc ;;
*** WE ROLL BACK TRANSACTION (1)
[16 Dec 2010 22:20]
Paula Wing
mysql> show variables like 'innodb%';
+-----------------------------------------+------------------------+
| Variable_name | Value |
+-----------------------------------------+------------------------+
| innodb_adaptive_hash_index | ON |
| innodb_additional_mem_pool_size | 1048576 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_buffer_pool_size | 67108864 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_doublewrite | ON |
| innodb_fast_shutdown | 1 |
| innodb_file_io_threads | 4 |
| innodb_file_per_table | ON |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | |
| innodb_force_recovery | 0 |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 1048576 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 90 |
| innodb_max_purge_lag | 0 |
| innodb_mirrored_log_groups | 1 |
| innodb_open_files | 300 |
| innodb_rollback_on_timeout | OFF |
| innodb_stats_on_metadata | ON |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 20 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 8 |
| innodb_thread_sleep_delay | 10000 |
| innodb_use_legacy_cardinality_algorithm | ON |
+-----------------------------------------+------------------------+
35 rows in set (0.00 sec)
Full query for transaction 1 is as follows:
SELECT /*TaskConsistency-product*/ * FROM (
SELECT
p.product_id,
p.available_quantity as p_available_quantity,
p.unavailable_quantity as p_unavailable_quantity,
ifnull((SELECT sum(gpm.available_quantity)
FROM goo_product_map gpm JOIN goo g ON (g.goo_id = gpm.goo_id AND g.goo_type = ?)
JOIN pods on (g.pod_id = pods.pod_id and pods.status = ?)
WHERE product_id = p.product_id), 0) as bin_quantity, +
ifnull((SELECT sum(milestones.untasked_quantity)
from milestones JOIN jobs USING (job_id)
where jobs.status = ?
and milestones.type IN (?,?)
and milestones.untasked_quantity != 0
AND (milestones.product_id = p.product_id)), 0) as p_untasked_quantity,
p.pickable_quantity as p_pickable_quantity,
pt.product_type_id,
pt.available_quantity as pt_available_quantity,
pt.pickable_quantity as pt_pickable_quantity,
pt.unavailable_quantity as pt_unavailable_quantity
FROM products p
JOIN product_types pt USING (product_type_id)
JOIN tasks USING (product_id)
WHERE tasks.task_id = ?) a
WHERE (p_available_quantity != bin_quantity - p_untasked_quantity)
OR p_available_quantity > p_pickable_quantity
OR pt_available_quantity > pt_pickable_quantity
OR p_unavailable_quantity > p_pickable_quantity
OR pt_unavailable_quantity > pt_pickable_quantity
OR p_pickable_quantity < 0
OR pt_pickable_quantity < 0
OR pt_pickable_quantity < p_pickable_quantity;
[17 Dec 2010 9:04]
Valeriy Kravchuk
Looks like a duplicate of bug #46947. Please, check.
[17 Dec 2010 13:36]
Paula Wing
Yes, this duplicates 46759 - with binlog enabled, and STATEMENT level replication, there are locks on nested SELECT. Thanks for pointing me to that issue!
[17 Dec 2010 13:49]
Valeriy Kravchuk
Duplicate of bug #46947.
[17 Dec 2010 19:26]
Paula Wing
Is this the same issue that was patched in 5.1.48 listed here: http://bugs.mysql.com/bug.php?id=46947
[17 Dec 2010 19:27]
Paula Wing
please ignore the last comment, posted to the wrong ticket, thanks!
