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

私が自分で作ったのは、挿入時に設定sortし、挿入された行を0取得し、に設定することです。ただし、トランザクションを使用することもできます。idsortid*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 をサポートしているわけではないため、それらを個別に実行する必要がある場合がありますが、1 つの接続のストリームで実行する必要があります。

もう 1 つの方法は、実行されるまでテーブル全体をロックすることINSERTですが、挿入が実行されるまで待機する必要があるため、クエリ キューの増加につながります。

于 2013-01-27T16:41:37.017 に答える