这样使用悲观锁for update有用吗
DB::beginTransaction();
try {
$workorderModel = new Workorder();
$exists = $workorderModel->where('order_id', $order->id)->where('status', 'action')->forUpdate()->exists();
if ($exists > 0) {
throw new InvalidRequestException('该订单存在未处理工单(收到工单),请先撤销');
}
$receiver_user_id = $order->seller_user_id;
Workorder::create([
'order_id' => $order->id,
'task_sn' => $order->task_sn,
'order_status' => $order->status,
'sender_user_id' => Auth::user()->id,
'sender_user_type' => Auth::user()->type,
'receiver_user_id' => $receiver_user_id,
'enum' => $request->enum,
'description' => $request->description,
'picture' => $request->picture,
]);
DB::commit();
}catch (\Exception $e) {
DB::rollBack();
throw $e;
}
之前都是用于->first()里面
这个用于exits不知道会不会等待,没用锁的话,系统卡的时候还是会导致重复提交
你用sleep 测试下就知道了
这样肯定没用呀,forUpdate是行级锁,并不会再并发线下避免你重复写入的情况,你可以用个字段唯一索引约束,或者用redis锁就可以解决你并发下重复写入的问题
测了一下是有用的