firstOrCreate 会有并发问题

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

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

最终出现了两条记录

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 16

有唯一键吗

4年前 评论

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

4年前 评论

加上lockForUpdate() 有用吗

4年前 评论

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

4年前 评论

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

4年前 评论

@lovecn id 是唯一

4年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论
EthanYep

了解一下

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

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

4年前 评论

那每次使用 firstOrCreate 都要加锁?

@农村闲散劳动力
@Max

4年前 评论
Max 4年前
yybawang

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

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

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

4年前 评论

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

4年前 评论

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