我正在拉威尔开发一个投标应用程序。在这件事上,我得跑了 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();
}
有谁能告诉我如何克服这个错误吗?
暂无答案!
目前还没有任何答案,快来回答吧!