zoukankan      html  css  js  c++  java
  • MySQL update A set num=num+ ? where id=?是否存在并发的问题

    参考:https://blog.csdn.net/qq_41445224/article/details/89299758

    参考:https://blog.csdn.net/silyvin/article/details/79294508?tdsourcetag=s_pctim_aiomsg

    在我们的实际开发中,往往会遇到更新数据字段的问题。如投票时,如果多人同时投票,是否存在在取数据并更新的时候,原始值是相同的,而后续的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。

  • 相关阅读:
    RocketMQ4.5.2在centos7的安装
    android 9.x 实现应用内更新安装
    android listview 禁止滚动
    Failed to resolve loader: less-loader
    yarn的 文件名、目录名或卷标语法不正确
    Interceptor无法用Autowired自动注入Bean
    STL文件格式研究
    在C#中用COM操作CAD
    AVEVA CSG 几何图形输出接口
    PDMS数据库快速索引查询
  • 原文地址:https://www.cnblogs.com/crazylqy/p/13749687.html
Copyright © 2011-2022 走看看