PCCAD打印样式中只看到.ctb或.stb,如何切换?
2026/6/10 15:11:16
核心心态:悲观。我觉得总有人想害朕(想抢我的数据)。
做法:只要我开始用这条数据,我就把门锁死。在我处理完之前,谁也别想碰,连“读”都不行,都在外面排队!
你需要显式地告诉数据库“给我锁上”:
-- 开启事务BEGIN;-- 重点是 FOR UPDATE,这句话一出,这行数据就被你独占了SELECTstockFROMgoodsWHEREid=1FORUPDATE;-- 在这期间,别的线程执行 SELECT ... FOR UPDATE 会被卡死在这里UPDATEgoodsSETstock=stock-1WHEREid=1;COMMIT;-- 只有等你提交了,锁才释放核心心态:乐观。我觉得大部分时间没人跟我抢。
做法:我不锁门,大家随便进,随便读。但是我提交修改的时候,我要检查一下,在我修改期间,有没有别人偷着改过数据。
index.vue拉到了本地(Version 1)。通常我们在表里加一个字段:version(版本号)。
stock = 1, version = 1stock = 1, version = 1-- 我要把 version 变成 2,前提是现在的 version 必须还是 1UPDATEgoodsSETstock=0,version=2WHEREid=1ANDversion=1;version变成了 2。-- B 手里拿的 version 还是 1,它想把 version 变成 2UPDATEgoodsSETstock=0,version=2WHEREid=1ANDversion=1;-- 👈 此时数据库里的 version 已经是 2 了!version = 1匹配不到任何行。更新失败(影响行数 0)。记得我之前推荐你的MyBatis-Plus吗?它把乐观锁封装成了“傻瓜式”操作。
第一步:数据库表里加个字段version,默认值 1。
第二步:Java 实体类加个注解。
publicclassGoods{privateLongid;privateIntegerstock;@Version// 👈 就加这一个注解,告诉 MP 这是乐观锁字段privateIntegerversion;}第三步:配置一下插件(现在的代码里只需要注册一个 Bean)。
第四步:正常写代码。
// 1. 先查出来 (必须先查,拿到当前的 version)Goodsgoods=goodsMapper.selectById(1);// 假设此时 version=1// 2. 修改数据goods.setStock(goods.getStock()-1);// 3. 更新// MyBatis-Plus 会自动把你生成的 SQL 变成:// UPDATE goods SET stock=0, version=2 WHERE id=1 AND version=1intresult=goodsMapper.updateById(goods);if(result==0){return"抢购失败,被人截胡了!";// 没抢到锁}FOR UPDATE。先锁后干。像红绿灯,红灯停绿灯行。version字段。先干后查。像斑马线,看着没人才走,走到一半发现有车来了就退回来。在面试里,只要你能说出**“为了性能,我们一般优先使用基于版本号的乐观锁,除非是像金额扣减这种极度敏感的业务才考虑悲观锁”**