2017-03-21 116 views
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()を使用している可能性があります。

答えて

0

トランザクションとは異なる方法をお勧めします。

コールバック内で例外が発生した場合、トランザクションはロールバックしてロックを解放します。

+0

\ DB :: rollBack()を使用しても違いはありますか。私がしたようにキャッチブロックの内側に? –

関連する問題