业务逻辑是这样的:
统计某一文章每一天的获赞次数:
tb(id,time,num)
id:文章ID
time:2016-1-31
id,time是复合主键
业务流程:
sql_1:select * from tb where id=$id and time=$t
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)
就是这样的很简单逻辑,本来没有什么问题,可是最近老是出错,原因是因为插入重复的复合主键,我才知道这样设计有并发的问题(两个进程同时判断通过,就会导致sql_2_执行两次而出错);
网上有很多讲这样的知识的,乐观锁,悲观锁等,但是都是将一些理论知识,一遇到实际问题,就没人理你了,书本上也基本是理论知识,没有实际问题的解决方法,我没有经验,不知道怎么解决这个问题,不想用乐观锁,需要要建一个version字段觉得不爽,程序多个地方用到时还不好控制。
意识到这个问题之后,我发现我之前所有的代码其实都会有这个问题,我相信上面这个逻辑是个非常基本的逻辑,我没想到会有这样的问题,好恐怖;
如果需要用到事务,我就把表全改为innodb的;
希望高人指点,就我上面的例子说实际的解决办法,不要找一些理论知识我看了。
谢谢大家了。
实名反对以上答案!!!
mysql:
1.ON DUPLICATE KEY UPDATE语句
ID,time复合主键
2.悲观锁for update