业务逻辑是这样的:
统计某一文章每一天的获赞次数:
tb(id,time,num)
id:文章ID
time:2016-1-31
id,time是复合主键
业务流程:
就是这样的很简单逻辑,本来没有什么问题,可是最近老是出错,原因是因为插入重复的复合主键,我才知道这样设计有并发的问题(两个进程同时判断通过,就会导致sql_2_执行两次而出错);
网上有很多讲这样的知识的,乐观锁,悲观锁等,但是都是将一些理论知识,一遇到实际问题,就没人理你了,书本上也基本是理论知识,没有实际问题的解决方法,我没有经验,不知道怎么解决这个问题,不想用乐观锁,需要要建一个version字段觉得不爽,程序多个地方用到时还不好控制。
意识到这个问题之后,我发现我之前所有的代码其实都会有这个问题,我相信上面这个逻辑是个非常基本的逻辑,我没想到会有这样的问题,好恐怖;
如果需要用到事务,我就把表全改为innodb的;
希望高人指点,就我上面的例子说实际的解决办法,不要找一些理论知识我看了。
1.ON DUPLICATE KEY UPDATE语句
ID,time复合主键
INSERT INTO tb (id,time,num) values ($id,$t,1) ON DUPLICATE KEY UPDATE num=num+1;
2.悲观锁for update
select * from tb where id=$id and time=$t for update
if (sql_1)
sql_2:updata from tb set num = num + 1 where id=$id and time=$t
else
sql_2_:INSERT INTO tb (id,time,num) values ($id,$t,1)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。