当前位置:网站首页>MySQL 45 lecture learning notes (VII) line lock

MySQL 45 lecture learning notes (VII) line lock

2022-07-04 06:38:00 Tom Kong

One . What is a row lock

  • MySQL The row lock is implemented by each engine in the engine layer . But not all engines support row locks . such as MyISAM The engine doesn't support row locks . Not supporting row locks means that concurrency control can only use table locks .         
  • For tables with this engine . Only one update can be executed at any time on the same table , This will affect the business concurrency
  • InnoDB It supports row locking . This is also MyISAM By InnoDB One of the important reasons for substitution .

Improve business concurrency by reducing lock conflicts

Row locks are locks for row records in the data table .

Two . Two stage lock

For example, affairs. A Updated a line , It's time for business B Also update the same line , Then we have to wait for business A You can't update until the operation of .

  • Business B Of update The statement will be blocked , Until transaction A perform commit after , Business B In order to proceed .
  • stay InnoDB Transaction , Row lock will be added when necessary , however Will not be released immediately , It is Wait for the transaction to end before releasing , This is it. Two stage lock protocol

If you need to lock more than one hang in your affairs , The most likely cause of lock conflict , The locks that are most likely to affect concurrent reads should be put back as far as possible .

3、 ... and . Use scenarios

example :
        Suppose you implement a movie ticket online trading business customer A In the cinema B Buying movie tickets requires the following operations :

  • From customers A The movie ticket price is deducted from the account balance
  • To the cinema B Your account balance increases the ticket price of this movie
  • Keep a transaction log

analysis

  • To close the deal , We need to update Two records , also insert A record .
  • Of course, in order to ensure the atomicity of the transaction , We need to put these three operations in one transaction , How can we arrange the order of these three statements in a transaction ?

solve

  • According to the two-stage lock protocol , No matter how you arrange the sentence order , All row locks required for operations are released only when the transaction is committed .
  • therefore , If you put the sentence 2 Arrange until the end , If according to 3,1,2 The order of , Then the lock time of the cinema account balance line is the least , This greatly reduces the lock waiting between transactions , Increased concurrency .

Four . problem 2

      If this theater is active , You can pre sell all movie tickets for a year at a low price , And it's only for one day . So when the activity time starts , Yours Mysql I hung up. , You log on to the server and have a look ,CPU Consumption is close to 100

But the whole database It cannot be executed every second 100 One transaction , What's the reason for this ?

Deadlock detection is costly CPU resources

5、 ... and . Deadlock and deadlock detection

      When circular resources appear in different threads in the concurrent system , The threads involved are waiting for other threads to release resources , It will cause these threads to enter the state of infinite waiting , be called Deadlock .

    

 

  • Business A Waiting for business B Release id=2 The row lock , And the business B Waiting for business A Release id=1 The row lock . Business A And transaction B Waiting for each other's resources to be released , Is to enter the deadlock state , When there's a deadlock , There are two strategies ;
  • Another strategy is , Initiate deadlock detection , After deadlock is found , Actively roll back a transaction in the deadlock chain , Allow other business to continue . The parameter innodb_deadlock_detect Set to on, Indicates that the logic is turned on .

6、 ... and . Disadvantages of timeout release strategy

  • stay InnoDB in ,innoDB_lock_wait_timeout The default value of is 50s, That means if you use the first strategy , When there's a deadlock , The first one is to lock the thread 50s Will time out
  • Then it's possible for other threads to continue , For online services , This waiting time is often unacceptable ,
  • But we can't set it to a small value , Such as 1s. When a deadlock occurs , It can really be solved soon , But if it's not deadlock , But simply lock and wait , If the timeout setting is too short , There will be many accidental injuries .

7、 ... and . Active deadlock detection

  • and innoDB_deadlock_detect The default value of is on. Active deadlock detection when deadlock occurs , It can be found and processed quickly , But he has an extra burden .
  • Whenever a transaction is locked , It depends on whether the thread he depends on is locked by others , So circular , Finally, judge whether there is a cycle waiting , That's deadlock .

Scene question :

All transactions need to update the scenario of the same row

  • Every new blocked thread , We should judge whether it will lead to deadlock due to our participation , This is a time complexity of O(n) The operation of
  • Suppose there is 1000 All concurrent threads update the same row at the same time , So the deadlock detection operation is 100w, Although the final test result is no deadlock , But it will consume a lot during this period CPU resources . So you'll see CPU High utilization ,
  • But not a few transactions can be executed every second

Deadlock detection is costly CPU resources

Solution :

Temporarily turn off deadlock detection

  • This operation itself carries certain risks , Therefore, deadlock is generally not regarded as a serious error in business design , After all, there is a deadlock , Just roll back , This is business intact
  • Turning off deadlock detection means that there may be a lot of timeouts , It's business that's damaging .   

The idea is to control concurrent reading

  • For example, there is only one line at a time 10 Threads updating , So deadlock The cost of testing is very low , There will be no such problem. A direct idea is , Do concurrency control on the client side
原网站

版权声明
本文为[Tom Kong]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207040632594236.html