MySQL update A set num=num+ ? where id=?是否存在并发的问题

在我们的实际开发中,往往会遇到更新数据字段的问题。如投票时,如果多人同时投票,是否存在在取数据并更新的时候,原始值是相同的,而后续的update操作会造成错误的数据?

 比如,表名A,字段名为 number,如下的SQL语句:
                   
    语句1:update A set number=number+ 5 where id=1;
    语句2:update A set number=number+ 7 where id=1;
                   
    假设这两条SQL语句同时被mysql执行,id=1的记录中number字段的原始值为 10,那么是否有可能出现这种情况:
语句1和2因为同时执行,他们得到的number的值都是10,都是在10的基础上分别加5和7,导致最终number被更新为15或17,而不是22?

答案是不会
这个其实就是关系型数据库本身就需要解决的问题。
首先,他们同时被MySQL执行,你的意思其实就是他们是并发执行的,而并发执行的事务在关系型数据库中是有专门的理论支持的-ACID,事务并行等理论,所有关系型数据库实现,包括Oracle,MySQL都需要遵循这个原理。
简单一点理解就是锁的原理。这个时候第一个update会持有id=1这行记录的排它锁,第二个update需要持有这个记录的排它锁的才能对他进行修改,正常的话,第二个update会阻塞,直到第一个update提交成功,他才会获得这个锁,从而对数据进行修改。
也就是说,按照关系型数据库的理论,这两个update都成功的话,id=1的number一定会被修改成22。如果不是22,那就是数据库实现的一个严重的bug。

参考
https://blog.csdn.net/silyvin/article/details/79294508

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 816评论 0 3
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 3,015评论 0 8
  • 太阳的冷酷 在眼中 在岁月 月亮的温暖 在心湾 在寒夜 太阳告诉我 实力与力量 月亮什么都没说 我却学会了思考 与方向
    风鸣心会阅读 232评论 0 6
  • 前几日,因为工作需要,去了内蒙乌拉特中旗的一家牧羊场——数羊,听上去有点搞笑,事实上是例行的资产盘点事项。 说是数...
    大碗chen阅读 1,758评论 0 6
  • 互斥锁:当一线程进入synchronized修饰的代码块或者方法,其它线程等待,知道锁被释放;内置锁:对象锁,每个...
    懒眉阅读 504评论 0 1