InnoDB 悲观锁:
抢购场景下的减库存问题
首先需要设置 mysql 为非autocommit
set autocommit = 0;
具体事务如下
begin;begin work;start transaction;(三选一) select stock from goods where id = 1 for update; insert into orders (id,good_id,num) values(null,1,2); update goods set stock = stock - 2 where id = 1; commit;
InnoDB支持通过特定的语句进行显示加锁:
select...lock in share mode
select...for udpate
但是执行for update会产生一些其他的影响
1.select语句变慢
2.一些优化无法正常使用,例如索引覆盖扫描
3.很容易造成服务器的锁争用问题