2025/12/28 0:30:50
网站建设
项目流程
电子购物网站建设目的,网站建设及维护保密协议,广州公共资源交易中心招标网,域名网站大全1. 悲观锁 (Pessimistic Lock) —— “占着茅坑不拉屎”
核心心态#xff1a; 悲观。我觉得总有人想害朕#xff08;想抢我的数据#xff09;。
做法#xff1a; 只要我开始用这条数据#xff0c;我就把门锁死。在我处理完之前#xff0c;谁也别想碰#xff0c;连“读”…1. 悲观锁 (Pessimistic Lock) —— “占着茅坑不拉屎”核心心态悲观。我觉得总有人想害朕想抢我的数据。做法只要我开始用这条数据我就把门锁死。在我处理完之前谁也别想碰连“读”都不行都在外面排队生活比喻上公厕你进了一个单间。咔嚓把门插销锁上数据库行锁。你在里面玩手机、看报纸处理业务逻辑。外面来了 100 个人推门发现打不开只能在门口干等着阻塞 Blocked。你完事了开门出来提交事务 Commit。下一个人才能进去。SQL 是怎么写的你需要显式地告诉数据库“给我锁上”-- 开启事务BEGIN;-- 重点是 FOR UPDATE这句话一出这行数据就被你独占了SELECTstockFROMgoodsWHEREid1FORUPDATE;-- 在这期间别的线程执行 SELECT ... FOR UPDATE 会被卡死在这里UPDATEgoodsSETstockstock-1WHEREid1;COMMIT;-- 只有等你提交了锁才释放优点绝对安全数据绝对一致。缺点性能极差。万一你在里面死锁了或者处理太慢整个系统就瘫痪了。适用场景数据极其敏感且并发量很低比如银行转账。2. 乐观锁 (Optimistic Lock) —— “Git 代码冲突”核心心态乐观。我觉得大部分时间没人跟我抢。做法我不锁门大家随便进随便读。但是我提交修改的时候我要检查一下在我修改期间有没有别人偷着改过数据。生活比喻Git 提交代码Pull你和小王都把index.vue拉到了本地Version 1。Edit你在本地改代码小王也在本地改代码。互不影响。Push关键时刻小王手快先提交了Version 变成 2。你后提交Git 告诉你“冲突了你的版本V1过期了现在的最新版是 V2。”Retry你只能重新拉取最新代码合并一下再提交。数据库怎么实现重点版本号机制通常我们在表里加一个字段version(版本号)。第一步查数据线程 A 查到stock 1, version 1线程 B 查到stock 1, version 1第二步线程 A 抢先修改-- 我要把 version 变成 2前提是现在的 version 必须还是 1UPDATEgoodsSETstock0,version2WHEREid1ANDversion1;结果成功数据库里的version变成了 2。第三步线程 B 慢了一拍去修改-- B 手里拿的 version 还是 1它想把 version 变成 2UPDATEgoodsSETstock0,version2WHEREid1ANDversion1;-- 此时数据库里的 version 已经是 2 了结果查找条件version 1匹配不到任何行。更新失败影响行数 0。应用层反应给用户报错“手慢了”或者自动重试。优点吞吐量极高不用排队大家都在跑。缺点如果冲突太频繁比如 100 个人抢 1 个会有 99 个人失败需要应用层处理重试逻辑。适用场景互联网大部分场景秒杀、点赞、评论。3. 在 Java (MyBatis-Plus) 里怎么用记得我之前推荐你的MyBatis-Plus吗它把乐观锁封装成了“傻瓜式”操作。第一步数据库表里加个字段version默认值 1。第二步Java 实体类加个注解。publicclassGoods{privateLongid;privateIntegerstock;Version// 就加这一个注解告诉 MP 这是乐观锁字段privateIntegerversion;}第三步配置一下插件现在的代码里只需要注册一个 Bean。第四步正常写代码。// 1. 先查出来 (必须先查拿到当前的 version)GoodsgoodsgoodsMapper.selectById(1);// 假设此时 version1// 2. 修改数据goods.setStock(goods.getStock()-1);// 3. 更新// MyBatis-Plus 会自动把你生成的 SQL 变成// UPDATE goods SET stock0, version2 WHERE id1 AND version1intresultgoodsMapper.updateById(goods);if(result0){return抢购失败被人截胡了;// 没抢到锁}总结悲观锁FOR UPDATE。先锁后干。像红绿灯红灯停绿灯行。乐观锁version字段。先干后查。像斑马线看着没人才走走到一半发现有车来了就退回来。在面试里只要你能说出**“为了性能我们一般优先使用基于版本号的乐观锁除非是像金额扣减这种极度敏感的业务才考虑悲观锁”**