当前位置:网站首页>On the concurrency of update operation
On the concurrency of update operation
2020-11-07 20:56:00 【daydaydream】
In a high concurrency scenario , This is often the case :
A Please come here , Look up a piece of data , Conduct update operation , meanwhile B Please come here at this time , Query this data , And operate . And then there will be B stay A After that, the query operation will be carried out , But the actual B But the data is A Cover .
Table name A, Field called number, As follows SQL sentence :
A operation sentence 1:select num from store where id='1';
Suppose that at this point a gets num= 99
B operation sentence 2:select num from store where id='1';
Because Party A has not yet update operation , B also got num= 99
Now A Conduct update operation
update store set num =${num} +1 where id='1';
At this time, it is written to the database num That is to say 100
here B The request also initiated the update operation :
update store set num =${num} +1 where id='1';
Our expectation at this time should have been 101 Of , But actually B I wrote in the database again 100
Solution :
(1) Introduce the concept of a version number , In the table A Add one version Field
A operation sentence 1:select num,version from store where id='1';
Suppose that at this point a gets num= 99 version =1
B operation sentence 2:select num,version from store where id='1';
Because Party A has not yet update operation , B also got num= 99 version=1
Now A Conduct update operation
update store set num =${num} +1 where id='1' and version = ${version};
At this time, it is written to the database num That is to say 100, version =2
here B The request also initiated the update operation :
update store set num =${num} +1 where id='1' and version = ${version} ;
At this time, we found the condition version = 1 Don't set up , Because the last step is version Have been to 2 了 , therefore update Cannot update .
(2) Solution :update A set number=number+1 where id=1; Statements are processed directly
Table name A, Field called number, As follows SQL sentence :
sentence 1:update A set number=number+1 where id=1;
sentence 2:update A set number=number+2 where id=1;
Suppose these two SQL The statement is simultaneously mysql perform ,id=1 In the record number The original value of the field is 99, So is it possible that :
sentence 1 and 2 Because at the same time , They got number The values are all 99, It's all in 10 On the basis of 1 and 2, Lead to the final number Is updated to 100 or 101, instead of 102
This is actually Relational database itself needs to solve the problem . First , They were also MySQL perform , What you mean is that they are executed concurrently , The concurrent transaction is supported by special theory in relational database - ACID, The theory of transaction parallelism , All relational databases implement , Include Oracle, MySQL We need to follow this principle .
The simple understanding is the principle of lock . This is the first time update Will hold id=1 This line records Exclusive lock , the second update You need to have an exclusive lock on this record to modify it , Normal word , the second update It will block , Until the first one update Submit successfully , He'll get the lock , To modify the data .
in other words , According to the theory of relational database , these two items. update If they all succeed ,id=1 Of number It must be modified to 22. If not 22, That's a serious problem with database implementation bug.
版权声明
本文为[daydaydream]所创,转载请带上原文链接,感谢
边栏推荐
猜你喜欢
The instanceof operator in ecmascript7 specification
数据库基本操作
websocket+probuf.原理篇
On the coverage technology and best practice of go code
技术总监7年自述——如何选择一家好公司
Animation techniques and details you may not know
Got timeout reading communication packets解决方法
Count the frequency of letters in text (case insensitive)
计组-总线通信控制之异步串行通信的数据传输
Using pipe() to improve code readability in pandas
随机推荐
Cpp(二) 创建Cpp工程
Adobe Lightroom /Lr 2021软件安装包(附安装教程)
聊聊Go代码覆盖率技术与最佳实践
Why do we need software engineering -- looking at a simple project
Facebook开源框架如何简化 PyTorch 实验
编程界大佬教你:一行Python代码能做出哪些神奇的事情?
计组-总线通信控制之异步串行通信的数据传输
Principles of websocket + probuf
获取树形菜单列表
Analysis of kubernetes service types: from concept to practice
What is the relationship between low code vs model driven?
大数据算法——布隆过滤器
Web安全(四)---XSS攻击
delphi10的rest.json与system.json的踩坑
Git代码提交操作,以及git push提示failed to push some refs'XXX'
京淘项目day09
C language I blog assignment 03
Sentry 安装
What magic things can a line of Python code do?
如何以计算机的方式去思考