如何防止在另一个进程更新行时从mysql选择

如何防止在另一个进程更新行时从mysql选择,mysql,laravel,locking,Mysql,Laravel,Locking,我有一个带有laravel的作业调度器,每个正在运行的作业都有从mysql中选择的数据,在得到数据库中的更新状态字段后,该行正在工作 但是,当多个进程运行时,可以交叉选择相同的行,而不更新状态 尝试了lockForUpdate()-没有帮助,DB::raw('LOCK TABLES accounts WRITE') $lock = Cache::lock('gettingWorker', 5); $lock->block(6, function () us

我有一个带有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原子锁似乎也不起作用,只是一些
睡眠(1)
在这种情况下起作用,但这不是一个交易-因为每小时运行的大量作业尝试使用start transaction并使用语句选择数据
select FOR UPDATE

步骤1:尝试保留非保留记录
UPDATE table set who_processes=@my_pid who_processes为null
,其中@my_pid是整个系统唯一的标识号。步骤2:检查步骤1是否成功(没有人拦截预订)
从who\u processes=@my\u pid
的表中选择count(*)。如果1-一切正常,保留记录,可以处理,转到步骤3。如果0-某些进程发生干扰,请转到步骤1。步骤3:过程记录(更新状态并执行其他操作)。