ruby中sequel多进程插入数据主键冲突

# 查询记录,有记录update,没有记录insert
# user_collects = CaiQiuService::CoreDao::UserCollects
#                     .where(:device_id => params[:device_id], :match_id => params[:match_id], :lottery_code => params[:lottery_code])
#                     .first
# if user_collects.nil?
#   user_collects = CaiQiuService::CoreDao::UserCollects.new
#   params[:create_time] = CaiQiuSupport::CaiQiuTime.get_current_time
# end
# params[:update_time] = CaiQiuSupport::CaiQiuTime.get_current_time
# user_collects.save_hash(params)

这种先查询数据库有没有记录,如果有就更新,没有就插入的写法,在高频点击的时候,就会出现主键唯一约束冲突的bug,因为高频点击造成接口被多次 同时 调用,同时调用 导致 多次同时查询数据库有没有记录,同时返回 没有记录,然后同时插入的操作,这个时候就会报错

测试方法是多进程调用

t1= Thread.new{func_001()}
t2= Thread.new{func_002()}
t1.join
t2.join

最后是把查询和插入的操作都放到数据库去做,这样就没有冲突了

user_collects = CaiQiuService::Base.DB_CORE[:user_collects]
user_collects.on_duplicate_key_update(
    :user_id => params[:user_id],
    :is_collect => params[:is_collect],
    :is_attent => params[:is_attent],
    :device_token => params[:device_token],
    :os_version => params[:os_version],
    :app_version => params[:app_version],
    :update_time => CaiQiuSupport::CaiQiuTime.get_current_time
).multi_insert(
    [:device_id => params[:device_id],
     :match_id => params[:match_id],
     :user_id => params[:user_id],
     :lottery_code => params[:lottery_code],
     :is_collect => params[:is_collect],
     :is_attent => params[:is_attent],
     :device_token => params[:device_token],
     :os_version => params[:os_version],
     :app_version => params[:app_version],
     :create_time => CaiQiuSupport::CaiQiuTime.get_current_time,
     :update_time => CaiQiuSupport::CaiQiuTime.get_current_time
    ]
)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左钦杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值