Meskipun Anda dapat melakukannya melalui straight_join, Anda juga dapat secara eksplisit mendapatkan kunci pada baris yang Anda inginkan dengan menduplikasi pilihan ...untuk pembaruan pada baris yang ingin Anda dapatkan terlebih dahulu.
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;
Karena penguncian dilakukan dalam beberapa langkah, entri dalam 'warna' tabel dapat dimodifikasi antara saat Anda menyiapkan tabel sementara dan saat Anda selesai mendapatkan kunci pada dua tabel.
Itu mungkin baik untuk Anda (yaitu jika Anda hanya ingin mengubah entri yang ada, saat transaksi dimulai) tetapi dapat menyebabkan bug halus jika bukan itu yang Anda inginkan.