企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 乐观锁和悲观锁 1. 乐观锁, 就是在每个表后面加一个version的字段, 由你自己去维护,修改一次+1, 如果发现取出来的和version不相等 就说明过期 那么说明是脏数据,但是这样耗费一定的查询性能,因为必须要在update的时候 去检查version 比如著名的els就使用这种模式,他每一条数据都有version这个隐藏字段 2. 悲观,也就是lock table 和 for update,就是独占,我写完之前不开锁。 # 乐观锁的缺点 乐观锁对于线程来说,只有两个状态:运行、就绪 。 时间片运行到期进入就绪状态,被调度的时候进入运行状态。 没有阻塞的状态。 想象一下,如果是乐观锁,并且系统中有1000个并发线程, 那所有的线程都在疯狂地运行,但是其中999个进入运行态的时候抢不到锁,都是无意义的空转, 白白消耗CPU。 操作系统也看不出那些线程优先级更高,只好公平调度,这么多线程,最后会导致一些重要的工作(不需要锁)也没有充足的时间来执行,岂不很悲催? # 乐观锁本质不是锁,而是Check And Set(检查,如果没有修改过,则写入). 比如基于数据库的会话存储系统: 乐观锁在不容易发生冲突的场合才高效,而高并发下冲突是很难避免的. 如果频繁发生冲突,导致操作失败,那处理一次请求的资源就白白浪费了. 其实操作失败也无所谓,给用户个提示就好了. 因为就算是传统的事务,也存在失败回滚的情况. 如果商品库存不够,或者用户余额不够,这次购买的事务都会失败ROLLBACK. 这里的all\_success表示两条UPDATE成功,各自受影响的行(affected\_rows/rowCount)都是1行.