1 Basic knowledge
Deducting inventory in the e-commerce system is a very critical operation. For example, in the flash sale system, overselling must be prevented. , if the merchant sets up 100 pieces of inventory but ends up selling 1,000 pieces, this will cause a financial loss. The following statement is generally used when deducting inventory:
udpate goods set stock = stock - #{acquire} where sku_id = #{skuId} and stock - #{acquire} >= 0
Let us analyze how this statement can effectively prevent inventory oversold in order to protect inventory resources. In the demonstration of this article, we use the MySQL Innodb engine and set the isolation level to repeatable read.
1.1 Shared lock and exclusive lock
Shared lock (share Lock) is also called read lock. The statement to implement the shared lock is as follows:
select lock in share mode
Exclusive lock (exclusive Lock) is also called write lock. The statement to implement exclusive lock is as follows:
select for update update delete insert
The compatibility relationship between shared lock and exclusive lock is as follows:
us Analyze the above compatibility relationship through examples. First, create a test table and write the test data:
CREATE TABLE `test_account` ( `id` bigint(20) NOT NULL, `name` varchar(20) DEFAULT NULL, `account` bigint(20) DEFAULT NULL, `version` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `test_account`(`id`,`name`,`account`,`version`) values (1,'A',100,1); insert into `test_account`(`id`,`name`,`account`,`version`) values (2,'B',200,1); insert into `test_account`(`id`,`name`,`account`,`version`) values (3,'C',300,1);
(1) Read and read compatibility
Shared lock and shared lock In the following example, session1 can execute the query at time t3 and session2 can obtain the expected results by executing the query at time t4:
(2) Read and write mutual exclusion
Shared locks and exclusive locks are mutually exclusive. In the following example, session1 adds a shared lock at time t3, and the result can be read correctly, but session2 tries to add an exclusive lock at time t4, but this When the lock is occupied by session1, session2 needs to wait. When session1 does not release the lock for a long time, session2 throws a lock timeout exception:
(3) Write-write interaction Exclusion
Exclusive locks and exclusive locks are mutually exclusive. In the following example, session1 adds an exclusive lock at time t3, and the result can be read correctly, but session2 tries to add an exclusive lock at time t4. lock, but the lock is occupied by session1 at this time, and session2 needs to wait. When session1 does not release the lock for a long time, session2 throws a lock timeout exception:
1.2 Current Reading and Snapshot Read
MySQL Innodb storage engine is implemented based on the multi-version concurrency control protocol MVCC. In MVCC concurrency control, read operations can be divided into snapshot reads and current reads.
Snapshot reading does not require locking. What is read is the visible version of the record, which may be a historical version. Similar to an order snapshot, even if the price of the product changes after the user places the order, the order snapshot remains unchanged. The current read statement is implemented as follows:
select
In order to read the latest version of the record without being modified by other transactions, the current record needs to be locked. The implementation of the current read statement is as follows:
select lock in share mode select for update update delete insert
We analyze the snapshot read and current read through an example. Session2 modified the record at t4 and submitted it at t5. Session1 performed a snapshot read at t6 and read this The result was 100 when the transaction started. The current read was performed at t7, and the latest version of the result 101 was read:
What is the current reading process like? We take update as an example to analyze the current reading process:
The first time the program instance issues a current read request, the storage engine returns the first record that satisfies the where condition and locks it. , the program instance then issues an update request, and the storage causes the operation to complete the response successfully. Execute in sequence until all records that satisfy the where condition are executed.
Here we make some extensions. The RR level provides two mechanisms to avoid phantom reading problems: The first method is snapshot reading, which reads the snapshot when the current transaction is started. One method for current reads is to use the Next-Key Lock mechanism to prevent phantom reads.
2 Optimistic Locking Principle
We integrate the above knowledge through a question: There are two threads executing the following statements at the same time. Will the account value of the record id=1 be successful? Deduction twice?
update test_account set account = account - 100, version = version + 1 where id = 1 and version = 1
The above statement uses optimistic locking. We know that optimistic locking protects resources, so the answer is not to deduct twice, but we cannot stop there. We need to combine the knowledge in Chapter 1 for further analysis. :
At time t2, session1 and session2 execute update operations at the same time. Since the update will add an exclusive lock, only one of the two can succeed: session1 succeeds, and session2 blocks and waits for the queue to be queued. It locks release.
At time t3, session1 commits the transaction to release the exclusive lock. At this time, session2 acquires the lock for current reading, but at this time the version value of the record with id=1 has become 2, and the executed statement cannot query the data to be updated, so there is no The record is updated.
3 Principle of inventory deduction
If you understand the optimistic locking principle in Chapter 2, then the principle of inventory deduction is already obvious. We assume that there is only 1 item left in stock. If two threads Will oversolding occur if inventory is reduced at the same time?
At t2, session1 and session2 execute updatek to reduce inventory at the same time. Since update will add an exclusive lock, only one of the two can succeed: session1 succeeds, and session2 blocks and waits. Exclusive lock released.
At time t3, session1 commits the transaction to release the exclusive lock. At this time, session2 acquires the lock for current reading, but at this time, the inventory of product 1 has become 0, which is no longer satisfied (where stock - 1 >= 0) Condition: The execution statement cannot query the data to be updated, so no records are updated.
The above is the detailed content of What is the principle of optimistic lock deduction inventory in MySQL?. For more information, please follow other related articles on the PHP Chinese website!

MySQLstringtypesimpactstorageandperformanceasfollows:1)CHARisfixed-length,alwaysusingthesamestoragespace,whichcanbefasterbutlessspace-efficient.2)VARCHARisvariable-length,morespace-efficientbutpotentiallyslower.3)TEXTisforlargetext,storedoutsiderows,

MySQLstringtypesincludeVARCHAR,TEXT,CHAR,ENUM,andSET.1)VARCHARisversatileforvariable-lengthstringsuptoaspecifiedlimit.2)TEXTisidealforlargetextstoragewithoutadefinedlength.3)CHARisfixed-length,suitableforconsistentdatalikecodes.4)ENUMenforcesdatainte

MySQLoffersvariousstringdatatypes:1)CHARforfixed-lengthstrings,2)VARCHARforvariable-lengthtext,3)BINARYandVARBINARYforbinarydata,4)BLOBandTEXTforlargedata,and5)ENUMandSETforcontrolledinput.Eachtypehasspecificusesandperformancecharacteristics,sochoose

TograntpermissionstonewMySQLusers,followthesesteps:1)AccessMySQLasauserwithsufficientprivileges,2)CreateanewuserwiththeCREATEUSERcommand,3)UsetheGRANTcommandtospecifypermissionslikeSELECT,INSERT,UPDATE,orALLPRIVILEGESonspecificdatabasesortables,and4)

ToaddusersinMySQLeffectivelyandsecurely,followthesesteps:1)UsetheCREATEUSERstatementtoaddanewuser,specifyingthehostandastrongpassword.2)GrantnecessaryprivilegesusingtheGRANTstatement,adheringtotheprincipleofleastprivilege.3)Implementsecuritymeasuresl

ToaddanewuserwithcomplexpermissionsinMySQL,followthesesteps:1)CreatetheuserwithCREATEUSER'newuser'@'localhost'IDENTIFIEDBY'password';.2)Grantreadaccesstoalltablesin'mydatabase'withGRANTSELECTONmydatabase.TO'newuser'@'localhost';.3)Grantwriteaccessto'

The string data types in MySQL include CHAR, VARCHAR, BINARY, VARBINARY, BLOB, and TEXT. The collations determine the comparison and sorting of strings. 1.CHAR is suitable for fixed-length strings, VARCHAR is suitable for variable-length strings. 2.BINARY and VARBINARY are used for binary data, and BLOB and TEXT are used for large object data. 3. Sorting rules such as utf8mb4_unicode_ci ignores upper and lower case and is suitable for user names; utf8mb4_bin is case sensitive and is suitable for fields that require precise comparison.

The best MySQLVARCHAR column length selection should be based on data analysis, consider future growth, evaluate performance impacts, and character set requirements. 1) Analyze the data to determine typical lengths; 2) Reserve future expansion space; 3) Pay attention to the impact of large lengths on performance; 4) Consider the impact of character sets on storage. Through these steps, the efficiency and scalability of the database can be optimized.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

WebStorm Mac version
Useful JavaScript development tools
