您的位置:首页 > 编程语言 > Ruby

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
]
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: