Как запретить выбор из mysql при очередном обновлении строки процесса - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть диспетчер заданий с laravel, каждое запущенное задание имеет выбор данных из mysql, и после того, как оно получено, обновляется поле состояния в БД, эта строка в работе.

Но когда выполняется несколько процессов, это может быть выделенным одинаковыми строками, пока он не обновлен.

попытался lockForUpdate() - не помогло, DB::raw('LOCK TABLES accounts WRITE') слишком

        $lock = Cache::lock('gettingWorker', 5);

        $lock->block(6, function () use ($acc) 
        {
            DB::raw('LOCK TABLES accounts WRITE');

            $this->worker = Accounts::getFreeAccount()->lockForUpdate()->firstOrFail();

            $this->worker->updateStatus('WORKING');

            $lock->release();
        });

laravel atomi c блокировки не работают в этом случае просто некоторые sleep(1) работают, но это не дело - потому что тысячи рабочих мест выполняется каждый час

1 Ответ

1 голос
/ 10 февраля 2020

Попробуйте использовать стартовую транзакцию и выберите данные с помощью выписки SELECT FOR UPDATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...