firstOrCreate 会有并发问题

请教一下关于 firstOrCreate 会有并发问题,我发现这样的语句

 $module->firstOrCreate([
                'video_id' => $request->video_id,
                'user_id' => $this->user()->id,
            ]);

最终出现了两条记录

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 16

有唯一键吗

1年前 评论
Linxb

确实会有并发的问题,所以在存在并发可能的地方,最好分开写

1年前 评论

加上lockForUpdate() 有用吗

1年前 评论

遇到了,偶尔会多产生一条数据

1年前 评论

这是编程本身的问题,高并发都要单独考虑一致性的。

1年前 评论

@lovecn id 是唯一

1年前 评论

@regforce
@linxb
那请教下分开写是怎么做,如何解决编程问题

1年前 评论

@tradzero 有用的 开启事物是可以的,但是这样感觉很多插入和更新 都要开启事物?

1年前 评论

'user_id' 'video_id' 如果逻辑上不会有两条一样的数据,可以建立联合唯一索引

1年前 评论

有并发问题的话就在这条语句外层加一个 lock 呀。

1年前 评论
JohnYep

了解一下

1年前 评论
农村闲散劳动力

肯定会有并发问题, 加锁吧

1年前 评论

那每次使用 firstOrCreate 都要加锁?

@农村闲散劳动力
@Max

1年前 评论
Max 1年前
yybawang

不是這個方法的問題,是所有的編程都有這種問題。
覺得業務太大會併發做好對應的防併發就好,普通業務根本不用糾結這些

  1. 可以加個3秒的緩存,後來的請求拒絕掉,unique index 也是這種,後來的數據不是唯一就 throw
  2. 如果是需要排隊等待的需求,就需要隊列了,返回值需要自己去監聽了.(入隊列前加個標記,執行完標記完成)
1年前 评论

这肯定会有并发问题,这个根据你的业务来,跟这个方法本身是没关系的,你可以加锁解决

1年前 评论

https://github.com/laravel/framework/issue...
这个issue有相关讨论,laravel相关的xxxxOrCreate都会有类似问题。
讨论里面有提供几种解决方法,主要思路就是操作之前加锁,或者操作失败之后做补偿

8个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!