Php Laravel中锁定功能中的死锁

Php Laravel中锁定功能中的死锁,php,mysql,laravel,locking,deadlock,Php,Mysql,Laravel,Locking,Deadlock,我正在开发一个投标申请在拉威尔。在这种情况下,我必须在每分钟后运行cronjob,用户也可以从前端出价。因此,为了避免冲突,我使用了laravel的lockForUpdate()。我已经将其放在两个不同的函数中,其中正在处理bid ID。在一个地方,我用了三次,在另一个地方,我用了一次。我已将代码放在DB::transaction中。但由于某些原因,每当两个用户同时处理同一个原始数据时,我就会遇到死锁错误 我使用的方法如下所示: 在一个地方 DB::beginTransaction(); try

我正在开发一个投标申请在拉威尔。在这种情况下,我必须在每分钟后运行
cronjob
,用户也可以从前端出价。因此,为了避免冲突,我使用了laravel的
lockForUpdate()。我已经将其放在两个不同的函数中,其中正在处理bid ID。在一个地方,我用了三次,在另一个地方,我用了一次。我已将代码放在
DB::transaction
中。但由于某些原因,每当两个用户同时处理同一个原始数据时,我就会遇到死锁错误

我使用的方法如下所示:

在一个地方

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();
    }

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

相关:。也许你应该试试
sharedLock()
方法?这是什么版本的拉威尔?根据建议,
lockForUpdate()
将阻止锁定的行被选中。如果您运行第一个函数两次,第二次为
$small
交换
$big
,则可能会出现死锁(如果时间不正确)。除此之外,我很难看到僵局会出现在哪里happen@DhruvSaxena我使用的是laravel 5.4。我也尝试过sharedLock(),但仍然出现死锁错误。@apokryfos否我只使用了第一个函数一次,但在这个函数中使用了lockforupdate()三次。导致死锁的原因之一是资源没有预先分配。通过抢先锁定事务启动后需要更新的所有行,您可能会成功地解决此问题。