当前位置:网站首页>关于update操作并发问题
关于update操作并发问题
2020-11-08 13:52:00 【osc_7eqzxl4g】
在高并发的场景下,经常会遇到这种情况:
A请求过来,查询出来一条数据,进行update操作,与此同时B请求也在这个时候过来,对这条数据进行查询,并进行操作。此时就会出现B在A之后进行查询操作,但是实际B的数据却被A覆盖。
表名A,字段名为 number,如下的SQL语句:
甲操作 语句1:select num from store where id='1';
假设此时甲获取到 num= 99
乙操作 语句2:select num from store where id='1';
因为甲方还没有update操作,乙获也取到 num= 99
这时候A进行update操作
update store set num =${num} +1 where id='1';
这时候写入数据库的num即为100
此时B请求也发起了更新操作:
update store set num =${num} +1 where id='1';
这时候我们的预期本应该是101的,但是实际上B又在数据库写入了100
解决方案:
(1)引入一个版本号的概念,在表A中增加一个version字段
甲操作 语句1:select num,version from store where id='1';
假设此时甲获取到 num= 99 version =1
乙操作 语句2:select num,version from store where id='1';
因为甲方还没有update操作,乙获也取到 num= 99 version=1
这时候A进行update操作
update store set num =${num} +1 where id='1' and version = ${version};
这时候写入数据库的num即为100, version =2
此时B请求也发起了更新操作:
update store set num =${num} +1 where id='1' and version = ${version} ;
这时候发现条件version = 1不成立,因为上一步操作version已经为2了,所以update无法更新。
(2)解决方式:update A set number=number+1 where id=1; 语句直接处理
表名A,字段名为 number,如下的SQL语句:
语句1:update A set number=number+1 where id=1;
语句2:update A set number=number+2 where id=1;
假设这两条SQL语句同时被mysql执行,id=1的记录中number字段的原始值为99,那么是否有可能出现这种情况:
语句1和2因为同时执行,他们得到的number的值都是99,都是在10的基础上分别加1和2,导致最终number被更新为100或101,而不是102
这个其实就是 关系型数据库本身就需要解决的问题。首先,他们同时被MySQL执行,你的意思其实就是他们是并发执行的,而并发执行的事务在关系型数据库中是有专门的理论支持的- ACID,事务并行等理论,所有关系型数据库实现,包括Oracle, MySQL都需要遵循这个原理。
简单一点理解就是锁的原理。这个时候第一个update会持有id=1这行记录的 排它锁,第二个update需要持有这个记录的排它锁的才能对他进行修改,正常的话, 第二个update会阻塞,直到第一个update提交成功,他才会获得这个锁,从而对数据进行修改。
也就是说,按照关系型数据库的理论,这两个update都成功的话,id=1的number一定会被修改成22。如果不是22, 那就是数据库实现的一个严重的bug。
版权声明
本文为[osc_7eqzxl4g]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4260217/blog/4708176
边栏推荐
- 金融领域首个开源中文BERT预训练模型,熵简科技推出FinBERT 1.0
- 入门级!教你小程序开发不求人(附网盘链接)
- 2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
- 技术总监7年总结,如何进行正确的沟通?
- Get PMP certificate at 51CTO College
- Golang 系统ping程序探测存活主机(任意权限)
- Or talk No.19 | Facebook Dr. Tian Yuandong: black box optimization of hidden action set based on Monte Carlo tree search
- 擅长To C的腾讯,如何借腾讯云在这几个行业云市场占有率第一?
- 软件开发中如何与人协作? | 每日趣闻
- OR Talk NO.19 | Facebook田渊栋博士:基于蒙特卡洛树搜索的隐动作集黑盒优化 - 知乎
猜你喜欢
“他,程序猿,35岁,被劝退”:不要只懂代码,会说话,胜过10倍默默努力
2035 we will build such a country
2020-11-05
10 common software architecture patterns
Implementation of verification code recognition in Python opencv pytesseract
Shell uses. Net objects to send mail
模板引擎的整理归纳
在51CTO学院Get到PMP证书
Ali tear off the e-commerce label
B站stm32视频学习
随机推荐
Flink从入门到真香(6、Flink实现UDF函数-实现更细粒度的控制流)
3、 The parameters of the function
Or talk No.19 | Facebook Dr. Tian Yuandong: black box optimization of hidden action set based on Monte Carlo tree search
应届生年薪35w+ !倒挂老员工,互联网大厂薪资为何越来越高?
Get PMP certificate at 51CTO College
你的云服务器可以用来做什么?云服务器有什么用途?
Python基础语法
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水
浅谈OpenGL之DSA
Ali! Visual computing developer's series of manuals (with internet disk link)
Alibaba cloud accelerates its growth and further consolidates its leading edge
阿里云加速增长,进一步巩固领先优势
Interpretation of deepmind's latest paper: the causal reasoning algorithm in discrete probability tree is proposed for the first time
Essential for back-end programmers: distributed transaction Basics
Golang ICMP协议探测存活主机
This year's salary is 35W +! Why is the salary of Internet companies getting higher and higher?
重返全球第三,小米做对了什么?
Improvement of rate limit for laravel8 update
Top 5 Chinese cloud manufacturers in 2018: Alibaba cloud, Tencent cloud, AWS, telecom, Unicom
用 Python 写出来的进度条,竟如此美妙~