ruby中sequel多进程插入数据主键冲突
2016-01-26 18:52
501 查看
# 查询记录,有记录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 ] )
相关文章推荐
- 在没有数据库表或者列的情况下新建model;rails ,ruby, rack
- ruby 基础知识点
- 安装Pod之前的工作——安装ruby环境
- IIS7 上配置运行 Ruby CGI环境
- Ruby的几道题目
- ruby on rails全局布局,局部视图,局部布局
- Ruby on Rails入门篇
- ruby-程序员最好的朋友
- Ruby vs Python
- 2015 年 Ruby 大盘点
- 2015 年 Ruby 大盘点
- 《Learn Ruby the Hard Way》
- MAC安装Ruby环境
- ruby 操作 Win32ole (windows自动化接口)
- swig基本入门
- Sass-Ruby及Sass、Compass在Windows下安装
- Deepin 安装RVM ,ruby, rails
- Making Fabric Play Nice with RubyMotion
- ruby安装mysql2模块
- ruby访问mysql