我有一个基本的Laravel设置:
我有一个事件,在注册event (new UserRegistered($user_id))
后会触发。
class UserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;
private $user_id;
/**
* Create a new event instance.
*
* @param $user_id
*/
public function __construct($user_id)
{
$this->user_id = $user_id;
}
/**
* @return mixed
*/
public function getUserId()
{
return $this->user_id;
}
}
该事件的事件侦听器实现ShouldQueue
,因此它由队列处理。
在EventListener@handle
方法上,我使用$user = User::find($event->getUserId());
class UserRegisteredListener implements ShouldQueue
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param UserRegistered $event
* @return void
*/
public function handle(UserRegistered $event)
{
$user = User::find($event->getUserId());
if (is_null($user)) {
Log::info($event->getUserId());
Log::error("User not found");
return;
}
// Some work
}
}
问题:
有时(100/1000之一)User::find
返回null
而不是记录,但我确信这样的记录存在于数据库中!
用户ID没问题,我在此查询后立即将其记录到日志文件中,并将其现有用户ID。
为什么有时候记录在数据库中找不到的任何想法(当存在时)?
解
我终于找到了解决方案:
我在注册服务中有DB::beginTransaction
和DB::commit
次来电。事件被解雇之前 DB::commit
来电,因此首先是race condition
或事件是commit
。