Я разрабатываю приложение для торгов в laravel.В этом случае я должен запускать cronjob
после каждой минуты, и пользователь также может делать ставки с внешнего интерфейса.Поэтому, чтобы избежать столкновения, я использую lockForUpdate()
от Laravel.Я поместил это в две разные функции, где обрабатываются идентификаторы ставок.И в одном месте я использую его три раза, а в другом - один раз.Я поместил свой код внутри 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();
}
Может кто-нибудь дать мне представление о том, как преодолеть эту ошибку?