Mặc dù bạn có thể làm điều đó thông qua Straight_join, bạn cũng có thể nhận được khóa rõ ràng trên các hàng bạn muốn bằng cách sao chép lựa chọn ... để cập nhật cho hàng mà bạn muốn nhận trước.
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;
Vì quá trình khóa được thực hiện theo nhiều bước nên các mục nhập trong 'màu' của bảng có thể được sửa đổi giữa khi bạn thiết lập bảng tạm thời và khi bạn hoàn thành việc lấy khóa trên hai bảng.
Điều đó có thể ổn đối với bạn (tức là nếu bạn chỉ muốn sửa đổi các mục nhập hiện có, khi giao dịch bắt đầu) nhưng có thể gây ra các lỗi nhỏ nếu đó không phải là điều bạn muốn.