laravel中锁定功能中的死锁

lc8prwob  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(341)

我正在拉威尔开发一个投标应用程序。在这件事上,我得跑了 cronjob 每分钟后,用户也可以从前端出价。所以为了避免碰撞,我用 lockForUpdate() 拉威尔的。我把它放在两个不同的函数中,其中bid id正在处理。在一个地方我用了三次,在另一个地方我用了一次。我已经把代码放进去了 DB::transaction . 但由于某些原因,每当两个用户同时处理同一个raw时,就会出现死锁错误。
我使用的方法如下:
在一个地方

DB::beginTransaction();
try
{
     -----Some Code ----

     SecondGameBids::where('id', $big)->lockForUpdate()->get();   
     SecondGameBids::where('id', $big)->update(['final_value' =>0, 'deal_status' => 1]);   

     -----Some Code ------

     SecondGameBids::where('id', $small)->lockForUpdate()->get();   
     SecondGameBids::where('id', $small)->update(['final_value' =>0, 'deal_status' => 1]); 

    ------Some Code ------

     DB::commit();
}
catch (\Exception $e) {

     DB::rollback();
}

在其他地方

DB::beginTransaction();
    try
    {
         -----Some Code ----

         SecondGameBids::where('id', $big)->lockForUpdate()->get();   
         SecondGameBids::where('id', $big)->update(['status' => 3]);   

         ------Some Code ------
         DB::commit();
    }
    catch (\Exception $e) {

         DB::rollback();
    }

有谁能告诉我如何克服这个错误吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题