firstOrCreate 会有并发问题

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

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

最终出现了两条记录

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 16

有唯一键吗

6年前 评论

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

6年前 评论

加上lockForUpdate() 有用吗

6年前 评论

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

6年前 评论

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

6年前 评论

@lovecn id 是唯一

6年前 评论

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

6年前 评论

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

6年前 评论

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

6年前 评论

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

6年前 评论
EthanYep

了解一下

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

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

5年前 评论

那每次使用 firstOrCreate 都要加锁?

@农村闲散劳动力
@Max

5年前 评论
weiwenhao 5年前
yybawang

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

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

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

5年前 评论

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

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!