Mysql transaction concurrency problem solution

Mysql transaction concurrency problem solution

I encountered such a problem during development

A video watching record, when updated to 100, means it has been watched, and it will not be updated if there are subsequent requests.

turn out:

As a result, many data inside are problematic.

It is speculated that the following circumstances will lead to

The first request transaction is in execution and has not been committed (because it is sometimes difficult to reproduce locally, so I manually sleep for a few seconds in the program when processing the first record to achieve this effect)

The second request transaction has started to execute. At this time, the historical maximum value found is not 100, so it will be updated.

I looked up the solution online:

Pessimistic Lock

Direct lock row record

I tested this locally and it really works. One transaction starts but does not end, and the second transaction waits. However, it will cause a blocking state because of system concurrency. I dare not consider it, so I just record this method.

Manual simulation:

Execute the first transaction:

-- Video 100 BEGIN;

SELECT * FROM `biz_coursestudyhistory` WHERE sid = 5777166;

UPDATE biz_coursestudyhistory set studyStatus = 100,versionNO=versionNO+1 WHERE sid = 1 AND versionNO = 0;

-- commit ; ​​Do not execute first, annotate first, and only execute the above 

Then execute the second transaction:

BEGIN;
 
UPDATE biz_coursestudyhistory set studyStatus = 90,versionNO=versionNO+1 WHERE sid = 1 AND versionNO = 0;
 
SELECT * FROM `biz_coursestudyhistory` WHERE sid = 1 FOR UPDATE;
 
COMMIT;

You will find that you cannot succeed and are always in a waiting state.

View Locks

It is indeed locked. Here, as long as the commit of the first transaction is executed, the second transaction will be executed.

From this we can see that row locks can directly achieve the ideal data unification state. If one transaction is modified, other operations cannot be performed. I feel that this is more suitable for security projects such as banks.

Optimistic locking:

This is simpler and does not cause blocking

The way is to add the version number

var maxver = select max(version) from table

To update, use

update table set studystatus = xxx,version = version +1 where id =1 and version = maxver

Written words

INSERT into table (contentStudyID,courseWareID,studyStatus,studyTime,endTime)
SELECT 27047358,3163,100,333,NOW() FROM dual WHERE NOT EXISTS (SELECT 1 FROM table WHERE contentStudyID =27047358 AND
courseWareID = 3163
 )

In this way, when updating or writing, you can directly determine whether the data in the library exists. If it does not exist, it is used by other threads.

After changing to this writing style, using jmeter for multi-threaded testing, the initial multiple record updates were successful, but now only one record is successful, and the rest fail.

From inserting multiple records at the beginning, to only inserting one data later

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

You may also be interested in:
  • Example of using MySQL transaction features to implement concurrent and safe auto-increment ID
  • Solution to PHP+MySQL high-concurrency locked transaction processing problem
  • Can MySQL's repeatable read level solve phantom reads?
  • Detailed explanation of how MySQL solves phantom reads
  • Detailed explanation of MySQL phantom reads and how to eliminate them
  • MySQL Series 10 MySQL Transaction Isolation to Implement Concurrency Control
  • How to solve the phantom read problem in MySQL
  • mysql+mybatis implements stored procedure + transaction + multi-concurrent serial number acquisition
  • Detailed explanation of concurrent dirty read + non-repeatable read + phantom read in Mysql transactions

<<:  Example code for converting http to https using nginx

>>:  Using vue3 to implement counting function component encapsulation example

Recommend

Detailed explanation of MySQL data rows and row overflow mechanism

1. What are the formats of lines? You can see you...

JavaScript to switch multiple pictures

This article shares the specific code of JavaScri...

Write your HTML like this to make your code more compatible

For example, users who need screen reading softwar...

HTML Tutorial: Collection of commonly used HTML tags (6)

These introduced HTML tags do not necessarily ful...

How to run multiple MySQL instances in Windows

Preface In Windows, you can start multiple MySQL ...

Detailed explanation of the adaptive adaptation problem of Vue mobile terminal

1. Create a project with vue ui 2. Select basic c...

Several common methods for passing additional parameters when submitting a form

When submitting a form, you may encounter situatio...

JavaScript imitates Taobao magnifying glass effect

This article shares the specific code for JavaScr...

How to increase HTML page loading speed

(1) Reduce HTTP requests. (Merge resource files a...

Linux cut command explained

The cut command in Linux and Unix is ​​used to cu...

VUE realizes registration and login effects

This article example shares the specific code of ...

MySQL 8.0.25 installation and configuration method graphic tutorial

The latest download and installation tutorial of ...

How to set up FTP server in CentOS7

FTP is mainly used for file transfer, and is gene...

Problem record of using vue+echarts chart

Preface echarts is my most commonly used charting...