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。