开发者社区> 问答> 正文

mysql数据库的一个并发问题

业务逻辑是这样的:
统计某一文章每一天的获赞次数:
tb(id,time,num)
id:文章ID
time:2016-1-31
id,time是复合主键
业务流程:
screenshot
就是这样的很简单逻辑,本来没有什么问题,可是最近老是出错,原因是因为插入重复的复合主键,我才知道这样设计有并发的问题(两个进程同时判断通过,就会导致sql_2_执行两次而出错);

网上有很多讲这样的知识的,乐观锁,悲观锁等,但是都是将一些理论知识,一遇到实际问题,就没人理你了,书本上也基本是理论知识,没有实际问题的解决方法,我没有经验,不知道怎么解决这个问题,不想用乐观锁,需要要建一个version字段觉得不爽,程序多个地方用到时还不好控制。

意识到这个问题之后,我发现我之前所有的代码其实都会有这个问题,我相信上面这个逻辑是个非常基本的逻辑,我没想到会有这样的问题,好恐怖;

如果需要用到事务,我就把表全改为innodb的;

希望高人指点,就我上面的例子说实际的解决办法,不要找一些理论知识我看了。

展开
收起
蛮大人123 2016-02-13 13:39:34 2662 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    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)
    2019-07-17 18:41:56
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像