
某电商平台的商品库存表在促销期间被后台管理员直接执行UPDATE操作调整库存,同时大量用户正在下单购买。数据库因行锁或表锁导致查询和写入阻塞,用户界面长时间无响应。
后台管理员通过命令行执行批量更新:
UPDATE products SET stock=1000 WHERE category='electronics';同一时刻出现:
locked状态进程表级锁争用:MySQL的MyISAM引擎在执行UPDATE时会锁定整张表,导致所有SELECT请求排队等待。
长事务阻塞:未提交的大批量更新事务持有锁时间过长,超过应用设置的超时阈值。
死锁风险:用户下单时的SELECT...FOR UPDATE与后台更新产生锁循环。
改用低锁粒度操作
UPDATE products SET stock=stock-1 WHERE item_id=123 AND stock>0;拆分批量更新 每500条数据作为一个事务提交,避免单事务过大:
START TRANSACTION;
UPDATE products SET stock=1000 WHERE id BETWEEN 1 AND 500;
COMMIT;添加重试机制
应用代码捕获LockWaitTimeout异常后自动退避重试:
for retry in range(3):
try:
execute_update()
break
except DatabaseLockError:
sleep(2**retry)SHOW PROCESSLIST中的锁等待