为了账号安全,请及时绑定邮箱和手机立即绑定

mysql insert 并发问题

mysql insert 并发问题

HUX布斯 2019-04-14 11:28:45
问题:我有两张表,一张是优惠券活动表,另一个是用户领取优惠券的明细表。如下CREATETABLE`coupon_activity`(`act_id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键',`act_code`char(6)NOTNULLDEFAULT''COMMENT'活动编码',`coup_issue_num`int(11)NOTNULLDEFAULT'0'COMMENT'优惠券发行量',`coup_per_num`int(11)NOTNULLDEFAULT'0'COMMENT'单个用户可领取数',PRIMARYKEY(`act_id`),UNIQUEKEY`act_code_idx`(`act_code`)COMMENT'活动编码唯一索引')ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='优惠券活动表';CREATETABLE`coupon_detail`(`coup_id`int(11)NOTNULLAUTO_INCREMENT,`act_code`char(6)NOTNULLDEFAULT''COMMENT'活动编号',`coup_code`char(6)NOTNULLDEFAULT''COMMENT'优惠券编码',`coup_user_id`int(11)NOTNULLDEFAULT'0'COMMENT'领取券用户id',PRIMARYKEY(`coup_id`),UNIQUEKEY`coup_code_idx`(`coup_code`)USINGBTREECOMMENT'优惠券编码唯一索引',KEY`coup_user_idx`(`coup_user_id`)USINGBTREECOMMENT'用户id普通索引',KEY`act_code_idx`(`act_code`)USINGBTREECOMMENT'活动编码普通索引')ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='优惠券明细表';假如现在有一个编码为act_code='000000'的优惠券活动,限定的没每个人只能领一张券,现在用户id=10的用户来领取该活动的券,在不考虑并发时的代码如下(#{}里面的字段表示前面的sql语句查出来的值):begin;select*fromcoupon_activitywhereact_code='000000';//当前10号用户领取该活动优惠券的数量selectcount(coup_id)ascount_perfromcoupon_detailwherecoup_user_id=10andact_code=#{act_code};//插入明细表当前用户领取量是否小于每个用户可领取数if(#{count_per}
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

提供一个思路供参考,写一条复杂的insert语句如下:
insertintocoupon_detail
select1,act_code,'000000',10from
(selectcount(coup_id)ascount_per
fromcoupon_detail
wherecoup_user_id=10andact_code=#{act_code}
)TMP
whereTMP.count_per<#{coup_per_num};
这样每次insert前会去检查先决条件.没有具体去试,但原则上我觉得应该可以解决你的问题.
                            
查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 293 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信