0
現在、一部の画像をdropzone.jsと並行してアップロードしようとしています。テーブルが空の場合、LockForUpdateによりデッドロックが発生する
これはアップロードを処理するコードの一部です。
\DB::beginTransaction();
$maxPos = GalleryImage::lockForUpdate()->max('pos');
try {
// some other code
// ....
$galleryImage->pos = $maxPos + 1;
$galleryImage->save();
} catch (\Exception $e) {
\DB::rollBack();
\Log::error($e->getMessage());
return response('An error occured', 500);
}
\DB::commit();
私がlockForUpdate()を使用しないと、データベース内の重複した位置になります。
Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
しかし、唯一私がアップロードしています第二の画像のために:表が空である場合、私はエラーを取得すること
上記の溶液イストでの問題、。
さらに自動インクリメントidは値2をスキップし、1,3,4,5,6,7のようになり、...テーブル内
体位が正しく表示されている1,2,3,4。 ...
私はこの問題は、すでにテーブルにいくつかのエントリがある場合、私はこの問題に気付かなかったので、最初は空であるテーブルと関係があると思います。
私が間違っていることは何ですか?または、集約関数と組み合わされたlockForUpdate()を使用している可能性があります。
\ DB :: rollBack()を使用しても違いはありますか。私がしたようにキャッチブロックの内側に? –