Mysql并发保证数据一致性——实例


最近的项目中遇到一项问题,并发更新某一单据的时候,出现了更新失效的情况。比如:生成的SQL大概是这样的:那么以上代码产生的问题就是:
对于同一个id=1来说,请求A与请求B都进到了update方法中,此时按id查询得到的信息是相同的,那么请求A更新了id=1的这条记录之后,此时,请求B又对id=1的记录进行更新,此时注意请求B更新id=1的记录的时候,请求B按id查询到的数据已经是旧数据,请求B执行完之后,请求A的更新被请求B覆盖了。如果更新的是状态,那倒无所谓,如果库存量呢?
如果更新的是库存,是在这条记录的原始值上进行+或者-操作,是不是就出问题了?事后写了个小demo来复现问题,代码大致如下:需求: 某个分类每被访问一次,排序就+1;
开启两个客户端同时访问DAO层使用的mybatis,生成日志大致如下:
需要更新的sort值数据库初始为:0大致意思:
请求A与请求B,同时操作id=6的这条记录时,查询出来id=6的这条记录,然后请求A对其进行了修改 SET sort=1操作,完事之后,请求A的事务提交了。而此时请求B,通过i开发云主机域名d=6条件查询到的category的信息是请求A提交之前的,此时请求B执行了SET sort=1,覆盖了请求B的修改操作。解决方法其它很简单,我们上面可以看到,update语句是直接set sort=1的,我们只需要改为set sort = sort +1 就可以了。你不信?那我改一下试试:Mapper文件:我们执行试一下,看下日志:看到了吧,保证数据一致了吧我之前的文章有对Mysql事务这块做过详解,想知道真正原理的小伙伴请阅读: 深入理解mysql事务
注意,我这里使用的数据库是mysql8以上,应用服务器是单机版的。

相关推荐: MySQL5.7应当注意的参数

简介: 本篇文章主要介绍 MySQL 初始化应当注意的参数,对于不同环境间实例迁移,这些参数同样应当注意。注: 本文介绍的参数都是在配置文件 [mysqld] 部分。这几个系统变量通常成对出现,当我们想指定log_bin 选项时,必须也要指定server_id…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 06/04 20:59
Next 06/04 20:59

相关推荐