Sample Header Ad - 728x90

MySQL - How can a deadlock b caused by the same transaction?

0 votes
1 answer
907 views
I am experiencing a deadlock scenario, and it's possible that I'm just not reading this correctly but here are the details, my interpretation is at the bottom. The players: **Transaction 1**: An ETL that is deleting records in batches. **Transaction 2**: A store front. The offending table is as such:
CREATE TABLE items
(
  id BIGINT PRIMARY KEY,
  secondary_key BIGINT UNIQUE
)
T1 is attempting to delete records by the secondary_key, meanwhile T2 is attempting to update the secondary_key on an existing record So T1 is doing:
DELETE FROM items where secondary_key IN (1,2,3,4,5,6);
And T2 is doing:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- This is set at the beginning of a larger transaction

UPDATE items SET secondary_key = 7 where id = 4;
The deadlock log that I the get is as follows: Transaction 1
*** (1) TRANSACTION:
TRANSACTION 42065889, ACTIVE 25 sec fetching rows
mysql tables in use 2, locked 2
LOCK WAIT 62416 lock struct(s), heap size 7577808, 9631608 row lock(s)
MySQL thread id 177980, OS thread handle 47144643110656, query id 45451329  preparing
DELETE FROM items
      WHERE secondary_id IN (
        SELECT
          li.id
        FROM staging.legacy_items li
        WHERE change_operation = 'D'
        AND li.id BETWEEN 9082453 AND 29059282
      )
      AND legacy_id IS NOT NULL

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 878323 page no 160719 n bits 96 index PRIMARY of table items trx id 42065889 lock_mode X waiting
Transaction 2
*** (2) TRANSACTION:
TRANSACTION 42065914, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
34 lock struct(s), heap size 3520, 19 row lock(s), undo log entries 10
MySQL thread id 177524, OS thread handle 47137066059520, query id 45451721 updating
UPDATE items SET items.secondary_id = 29059300 WHERE items.id = 15558171

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 878323 page no 160719 n bits 96 index PRIMARY of table items trx id 42065914 lock mode S locks rec but not gap

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 878323 page no 160719 n bits 96 index PRIMARY of table items trx id 42065914 lock_mode X locks rec but not gap waiting
Result
*** WE ROLL BACK TRANSACTION (2)
---------- **SO..** to me it looks like: 1. Transaction 2 gets a shared lock on single record 2. Transaction 1 takes an exclusive lock on range of records 3. Transaction 2 tries to take an exclusive lock on the single record that it already has a shared lock for. I can't understand why Transaction 2 wouldn't be able to get an exclusive lock on the record that it already has a shared lock for. Am I interpreting this completely wrong? Thanks!
Asked by Gangie (1 rep)
Jan 9, 2020, 10:42 PM
Last activity: Apr 23, 2025, 07:00 PM