# 查询记录,有记录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 ] )