美文网首页
MySQL update A set num=num+ ? wh

MySQL update A set num=num+ ? wh

作者: 有点胖的小乐乐 | 来源:发表于2020-01-07 15:43 被阅读0次

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

    相关文章

      网友评论

          本文标题:MySQL update A set num=num+ ? wh

          本文链接:https://www.haomeiwen.com/subject/psoractx.html