MySQL 系统学习 第四阶段:MySQL 高级 第五节:锁机制(Lock)

📅 2026/7/14 5:17:54
MySQL 系统学习 第四阶段:MySQL 高级 第五节:锁机制(Lock)
上一节我们学习了事务。事务解决一组操作要么全部成功要么全部失败。但是还有一个问题多个事务同时操作同一份数据怎么办例如商品库存商品A 库存1两个用户同时购买用户A 下单 用户B 下单两个事务同时读取库存1然后库存 - 1结果库存-1这就是并发问题。一、为什么需要锁锁的本质控制多个事务对共享资源的访问顺序保证数据一致性。简单理解没有锁事务A | | 修改数据 | 事务B | | 同时修改数据可能产生冲突。有锁事务A | | 获取锁 | | 修改数据 | | 释放锁 事务B | | 等待保证数据安全。二、MySQL 中锁的分类MySQL 锁很多我们先掌握核心分类。按照粒度锁 │ ├── 表级锁 │ └── 行级锁按照功能锁 │ ├── 共享锁S锁 │ └── 排他锁X锁按照思想锁 │ ├── 悲观锁 │ └── 乐观锁三、表锁Table Lock什么是表锁锁住整张表。例如user表 ---- | | | | | | ----其他事务不能修改。示例加表锁LOCK TABLE user WRITE;释放UNLOCK TABLES;四、表锁特点优点简单。加锁成本低。缺点并发能力差。例如用户表100万用户。修改其中一个用户UPDATE user SET nameTom WHERE id1;如果使用表锁整个 user 表被锁。其他用户不能修改。所以表锁适合低并发场景。五、行锁Row Lock⭐⭐⭐⭐⭐什么是行锁只锁定某一条数据。例如修改UPDATE user SET nameTom WHERE id1;锁id1 其他id2 id3仍然可以操作。六、行锁的优势假设用户表100万数据。两个事务事务AUPDATE user SET nameTom WHERE id1;事务BUPDATE user SET nameJack WHERE id2;因为锁不同数据。可以同时执行。所以行锁大幅提高并发能力。七、为什么 InnoDB 支持行锁MySQL 存储引擎MyISAM只支持表锁InnoDB支持表锁 行锁所以企业项目通常使用InnoDB八、共享锁Shared Lock简称S锁也叫读锁。作用多个事务可以同时读取但不能修改。例如事务ASELECT * FROM user WHERE id1 FOR SHARE;加共享锁。事务B可以SELECT✅但是UPDATE user SET nameTom WHERE id1;❌等待锁释放。九、排他锁Exclusive Lock简称X锁也叫写锁。作用一个事务获得后其他事务不能读写。例如SELECT * FROM user WHERE id1 FOR UPDATE;加排他锁。事务A修改UPDATE user SET nameTom WHERE id1;可以。事务B修改同一条UPDATE user SET nameJack WHERE id1;等待。十、共享锁和排他锁区别共享锁 S排他锁 X作用读取修改别人能读✅❌部分情况别人能写❌❌使用场景保证读取一致保证修改安全十一、悲观锁Pessimistic Lock⭐⭐⭐⭐⭐思想数据很可能会被别人修改所以提前加锁。例如库存扣减库存100用户购买先锁SELECT stock FROM product WHERE id1 FOR UPDATE;然后UPDATE product SET stockstock-1 WHERE id1;特点安全。但是并发低。十二、乐观锁Optimistic Lock⭐⭐⭐⭐⭐思想默认认为不会冲突提交时检查有没有被修改。常见方式增加版本号。表product id stock version数据id1 stock100 version1事务A读取stock100 version1事务B修改stock99 version2事务A提交UPDATE product SET stock99, version2 WHERE id1 AND version1;发现影响行数0说明数据已经被修改。提交失败。十三、悲观锁 vs 乐观锁悲观锁乐观锁思想提前锁住提交检查方式数据库锁版本号并发能力低高安全性高需要处理冲突适合冲突频繁冲突较少十四、企业实际案例库存扣减假设库存stock1两个请求错误方式查询SELECT stock FROM product WHERE id1;返回1两个请求都看到1然后UPDATE product SET stock0问题超卖。方案1悲观锁BEGIN; SELECT stock FROM product WHERE id1 FOR UPDATE; UPDATE product SET stockstock-1 WHERE id1; COMMIT;方案2乐观锁增加version执行UPDATE product SET stockstock-1, versionversion1 WHERE id1 AND version10;成功影响行数1失败重新尝试。十五、锁等待和死锁锁等待事务A锁住用户1事务B想修改用户1结果B等待。死锁Dead Lock例如事务A锁A数据等待B数据事务B锁B数据等待A数据形成A 等 B B 等 A数据库检测后回滚其中一个事务。十六、本节总结概念说明锁控制并发访问表锁锁整张表行锁锁具体数据行共享锁读锁排他锁写锁悲观锁先加锁再操作乐观锁提交时检查死锁多个事务互相等待 本节核心一句话锁是数据库保证并发安全的机制InnoDB 通过行锁让多个事务能够安全并发执行。