sql >> Database teknologi >  >> RDS >> Mysql

Undgå dødlås ved at bestille eksplicit

Selvom du kan gøre det gennem straight_join, kan du også eksplicit få låsene på de rækker, du ønsker, ved at duplikere select ...for opdatering på den, du vil have først.

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;

Da låsningen udføres i flere trin, ville det være muligt for indtastninger i tabellen 'farver' at blive ændret, mellem når du opretter den midlertidige tabel, og når du er færdig med at få låsene på de to borde.

Det kan være ok for dig (dvs. hvis du kun ønsker at ændre eksisterende poster, når transaktionen starter), men det kan forårsage subtile fejl, hvis det ikke er det, du ønsker.




  1. Eksekverer du et php-script i javascript?

  2. Udførelse af flere SQL-forespørgsler i én sætning med PHP

  3. Tjek om der findes en række, ellers indsæt

  4. Send PHP Array via jQuery Ajax