Php 拉威尔:这个悲观锁定的例子正确吗?

Php 拉威尔:这个悲观锁定的例子正确吗?,php,laravel-5,locking,innodb,Php,Laravel 5,Locking,Innodb,我想通知一周内未收到通知的每个用户 代码如下所示: // Select all users where attribute `notified` is older then one week $users = \App\User::lastNotified(7)->get(); foreach($users as $user){ $user->notifed = date('Y-m-d'); \Mail::to($user)send(new NotificationMa

我想通知一周内未收到通知的每个用户

代码如下所示:

// Select all users where attribute `notified` is older then one week
$users = \App\User::lastNotified(7)->get();

foreach($users as $user){
   $user->notifed = date('Y-m-d');
   \Mail::to($user)send(new NotificationMail($user));
   $user->save();
}
DB::transaction(function () {
   $users = \App\User::lastNotified(7)->lockForUpdate()->get();

    foreach($users as $user){
       $user->notifed = date('Y-m-d');
       \Mail::to($user)send(new NotificationMail($user));
       $user->save();
    }
});
我想确保如果代码并行执行,每个用户只会收到一个通知(没有重复)

我是否正确地理解了我必须这样使用:

// Select all users where attribute `notified` is older then one week
$users = \App\User::lastNotified(7)->get();

foreach($users as $user){
   $user->notifed = date('Y-m-d');
   \Mail::to($user)send(new NotificationMail($user));
   $user->save();
}
DB::transaction(function () {
   $users = \App\User::lastNotified(7)->lockForUpdate()->get();

    foreach($users as $user){
       $user->notifed = date('Y-m-d');
       \Mail::to($user)send(new NotificationMail($user));
       $user->save();
    }
});

因此,如果脚本并行执行,速度较慢的脚本
B
将在线等待
$users=\App\User::lastNotified(7)->lockForUpdate()->get()直到更快的脚本
A
完成

旁注:您需要并行运行这样的进程吗?因为每个进程都会得到所有用户,然后戈尔就开始了。为什么不将脚本卸载到cron作业中,让它每天晚上11:00或其他时间运行?如果您的用户群>10000人,则可以开始考虑并行处理。@如果您是对的,cronjob每天只执行一次此脚本,不应并行运行。我只是想介绍一种情况,即如果出于任何原因,脚本可能会执行两次,但并非所有用户都会收到两次通知<代码>如果($user->notifiedly()){doNothing()}
。但是我不知道为什么foreach循环会在没有您指定的情况下运行两次。@Loek我担心添加
if
请求不会解决这个问题。如果脚本并行运行,用户仍然可以收到两个通知。但是你刚才说它不会并行运行?