1. 并发更新问题的本质与业务场景
上周排查一个电商库存超卖问题时,发现这是典型的丢失更新案例。当多个事务同时读取-修改-写入同一条记录时,后提交的事务会覆盖前一个事务的修改。比如两个客服同时处理同一订单的退款申请,系统记录的处理次数本该是2次,最终却只显示1次——这就是丢失更新的典型表现。
在MySQL的默认事务隔离级别REPEATABLE READ下,这种问题尤为隐蔽。开发环境可能一切正常,但生产环境一旦并发量上来,就会随机出现数据异常。我见过最严重的案例是金融系统账户余额更新丢失,直接导致资金对账不平。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题复现与原理分析
2.1 最小化复现场景
用这个简单的库存表做演示:
sql复制CREATE TABLE `inventory` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_code` varchar(32) NOT NULL,
`stock` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_product_code` (`product_code`)
) ENGINE=InnoDB;
INSERT INTO `inventory` VALUES (1, 'IPHONE_15', 100);
开启两个MySQL会话模拟并发:
sql复制-- 会话1
BEGIN;
SELECT stock FROM inventory WHERE product_code = 'IPHONE_15'; -- 得到100
-- 会话2
BEGIN;
SELECT stock FROM inventory WHERE product_code = 'IPHONE_15'; -- 也得到100
-- 会话1
UPDATE inventory SET stock = 99 WHERE product_code = 'IPHONE_15';
COMMIT; -- 库存变为99
-- 会话2
UPDATE inventory SET stock = 99 WHERE product_code = 'IPHONE_15';
COMMIT; -- 库存仍然是99!
