Chociaż możesz to zrobić przez straight_join, możesz również jawnie uzyskać blokady w żądanych wierszach, powielając opcję select ...for update w tym, który chcesz uzyskać jako pierwszy.
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;
Ponieważ blokowanie odbywa się w wielu krokach, możliwe byłoby modyfikowanie wpisów w tabeli 'colors' pomiędzy ustawieniem tabeli tymczasowej a zakończeniem uzyskiwania blokad na dwóch tabelach.
To może być dla ciebie w porządku (tj. jeśli chcesz tylko zmodyfikować istniejące wpisy, kiedy rozpocznie się transakcja), ale może spowodować subtelne błędy, jeśli nie tego chcesz.