我正在尝试将页面插入到一个带有排序列的表中,我以这种方式自动增加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。 sort列有一个索引。
答案 0 :(得分:0)
我为自己做的是在插入时设置sort
到0
,检索插入行的id
并将sort
设置为id*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客户端库都支持multiqueris,因此您可能必须单独执行它们,但需要在一个连接的流中执行。
另一种方法是在执行INSERT
时锁定整个表,但这会导致查询队列增加,因为它们必须等到执行插入