sql >> Database >  >> RDS >> Mysql

Vermijd dead lock door expliciet te bestellen

Hoewel je het via straight_join kunt doen, kun je ook expliciet de vergrendelingen op de gewenste rijen krijgen door de select ... for update te dupliceren op degene die je als eerste wilt krijgen.

CREATE TEMPORARY TABLE colorsToUpdate (
     colorID BIGINT(20) NOT NULL, 
     modelID BIGINT(20) NOT NULL
);

insert into colorsToUpdate ( colorID, modelID)
SELECT  id, model_id
FROM    colors
where id in (101, 105, 106);

#This will try to acquire lock on models
select m.* from models m
join colorsToUpdate c
on c.modelID = m.id
for UPDATE;

#this will try to get locks on models, and colors.
select m.*, c.*
from colorsToUpdate u
left join models m
on u.modelID = m.id
join colors c 
on u.colorID = c.ID
order by m.id asc, c.id asc
for update;

# do your data modification here.

drop table colorsToUpdate;

Omdat de vergrendeling in meerdere stappen wordt gedaan, is het mogelijk dat de gegevens in de tabel 'kleuren' worden gewijzigd tussen het moment waarop u de tijdelijke tabel instelt en wanneer u klaar bent met het verkrijgen van de vergrendelingen op de twee tabellen.

Dat is misschien goed voor u (d.w.z. als u alleen bestaande invoer wilt wijzigen, wanneer de transactie start), maar het kan subtiele bugs veroorzaken als dit niet is wat u wilt.




  1. C# oproep orakel opgeslagen functie

  2. krijg opeenvolgende records in mysql

  3. Boekbespreking :Benjamin Nevarez :Zoekopdracht afstemmen en optimaliseren

  4. Converteer 'datetime2' naar 'date' in SQL Server (T-SQL-voorbeelden)