繁体   English   中英

避免在与select结合使用insert时出现SQL死锁

[英]Avoiding SQL deadlock in insert combined with select

我正在尝试将页面插入具有排序列的表中,而排序列我将以这种方式在2000年之前自动递增:

INSERT INTO pages (sort,img_url,thumb_url,name,img_height,plank_id)
SELECT IFNULL(max(sort),0)+2000,'/image/path.jpg','/image/path.jpg','name',1600,'3'
FROM pages WHERE plank_id = '3'

问题是我在上传图片时触发了这些插入,因此这些查询中的5-10个几乎同时运行。 由于某些原因,这会在某些文件上触发死锁。

知道发生了什么吗?

编辑:我正在运行MySQL 5.5.24和InnoDB。 排序列具有索引。

我为我自己做的设置sort0的插入,检索id插入的行,并设置sortid*2000 但是,您也可以尝试使用事务:

BEGIN;
INSERT INTO pages (sort,img_url,thumb_url,name,img_height,plank_id)
SELECT IFNULL(max(sort),0)+2000,'/image/path.jpg','/image/path.jpg','name',1600,'3'
FROM pages WHERE plank_id = '3';
COMMIT;

请注意,并非所有的MySQL客户端库都支持多查询,因此您可能必须单独执行它们,但要以一个连接的方式执行。

另一种方法是在执行INSERT锁定整个表,但这将导致查询队列增加,因为它们将不得不等待执行插入操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM