0

我正在尝试将页面插入带有排序列的表中,我以这种方式自动递增 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。排序列有一个索引。

4

1 回答 1

0

我为自己所做的是设置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,但这会导致查询队列增加,因为它们必须等到执行插入

于 2013-01-27T16:41:37.017 回答