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