我想明确提供有关 MySql InnoDB 应如何获取行锁的顺序。如果可能的话,就不应该出现任何死锁。 (如果我们遵循惯例。)
首先,数据库应该按升序锁定表“models”中找到的所有行。然后第二个表“颜色”中的所有行都应按升序锁定。有没有办法控制数据库先锁定表“模型”,然后锁定“颜色”?
例如给出:
start transaction;
select *
from models m
join colors c on c.model_id = m.id
where c.id IN (101, 105, 106)
order by m.id asc, c.id asc
for update;
虽然您可以通过 Straight_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;
由于锁定是通过多个步骤完成的,因此在设置临时表和完成对两个表的锁定之间,表“颜色”中的条目可能会被修改。
这对您来说可能没问题(即,如果您只想在事务开始时修改现有条目),但如果这不是您想要的,则可能会导致微妙的错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)