虽然您可以通过 direct_join 来完成,但您也可以通过复制 select ...for update 来显式获取您想要的行上的锁。
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;
由于锁定是在多个步骤中完成的,因此可以在设置临时表和完成对两个表的锁定之间修改表“颜色”中的条目。
这对您来说可能没问题(即,如果您只想修改现有条目,则在事务开始时)但如果不是您想要的,可能会导致细微的错误。