当前位置:网站首页>关于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
边栏推荐
- Top 5 Chinese cloud manufacturers in 2018: Alibaba cloud, Tencent cloud, AWS, telecom, Unicom
- Rabbitmq (1) - basic introduction
- 刚刚好,才是最理想的状态
- Comics: looking for the best time to buy and sell stocks
- wanxin finance
- 我用 Python 找出了删除我微信的所有人并将他们自动化删除了
- OR Talk NO.19 | Facebook田渊栋博士:基于蒙特卡洛树搜索的隐动作集黑盒优化 - 知乎
- Flink from introduction to Zhenxiang (10. Sink data output elasticsearch)
- What is SVG?
- Ali! Visual computing developer's series of manuals (with internet disk link)
猜你喜欢
谷歌开源能翻译101种语言的AI模型,只比Facebook多一种
Flink从入门到真香(10、Sink数据输出-Elasticsearch)
Flink: from introduction to Zhenxiang (6. Flink implements UDF function - realizes more fine-grained control flow)
我们做了一个医疗版MNIST数据集,发现常见AutoML算法没那么好用
擅长To C的腾讯,如何借腾讯云在这几个行业云市场占有率第一?
The progress bar written in Python is so wonderful~
Ali! Visual computing developer's series of manuals (with internet disk link)
2020-11-05
Major changes in Huawei's cloud: Cloud & AI rises to Huawei's fourth largest BG with full fire
阿里撕下电商标签
随机推荐
When kubernetes encounters confidential computing, see how Alibaba protects the data in the container! (Internet disk link attached)
优化if-else代码的八种方案
nat转换的ip跟端口ip不相同的解决方法
Python basic syntax
Ali! Visual computing developer's series of manuals (with internet disk link)
python基础教程python opencv pytesseract 验证码识别的实现
Top 5 Chinese cloud manufacturers in 2018: Alibaba cloud, Tencent cloud, AWS, telecom, Unicom
Interpretation of deepmind's latest paper: the causal reasoning algorithm in discrete probability tree is proposed for the first time
阿里云加速增长,进一步巩固领先优势
软件开发中如何与人协作? | 每日趣闻
Android Basics - check box
STM32CubeIDE下载安装-GPIO基本配置操作-Debug调试(基于CMSIS DAP Debug)
Rust: performance test criteria Library
Share the experience of passing the PMP examination
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
金融领域首个开源中文BERT预训练模型,熵简科技推出FinBERT 1.0
适合c/c++新手学习的一些项目,别给我错过了!
Flink: from introduction to Zhenxiang (3. Reading data from collection and file)
OR Talk NO.19 | Facebook田渊栋博士:基于蒙特卡洛树搜索的隐动作集黑盒优化 - 知乎
啥是数据库范式