首页 > 其他分享 >悲观锁和乐观锁

悲观锁和乐观锁

时间:2022-09-07 15:01:02浏览次数:57  
标签:悲观 更新 乐观 version 版本 数据

https://segmentfault.com/a/1190000022839728

悲观锁介绍

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态

 

乐观锁介绍

乐观锁( Optimistic Locking )相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。实现方式:

使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现 方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现,version默认值为1。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们更新db的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新

 

如上图所示,如果更新操作顺序执行,则数据的版本(version)依次递增,不会产生冲突。但是如果发生有不同的业务操作对同一版本的数据进行修改,那么,先提交的操作(图中B)会把数据version更新为2,当A在B之后提交更新时发现数据的version已经被修改了,那么A的更新操作会失败。

db操作步骤:

1、select (status,status,version) from t_goods where id=1;

2、update t_goods set status = 2, version = version + 1 where id=1 and version=#{version};

所以当第一个请求更新时已经把version改成了2,第二个请求更新时发现where条件不匹配,所以不会更新成功。

   

 

标签:悲观,更新,乐观,version,版本,数据
From: https://www.cnblogs.com/MarkLeeBYR/p/16665455.html

相关文章

  • EFCore 悲观锁 和 乐观锁
    乐观并发控制并发令牌Owner经典例子就是两个人同时执行了抢购业务Update是同时执行的,这就导致后面的会覆盖前面的,导致业务出现问题!原理就是在update的表中Owner=......
  • 【三大锁】悲观锁——mysql悲观锁
    一三大常用锁悲观锁你准备去银行取10w了,跟银行提前打个招呼,有个10w现金谁都别动。(一般只限制写-别人不能取那10w但是能查到银行总体余额,某些场景会限制读)乐观......
  • 因为一个“乐观锁”引发的一些思考以及一系列问题
    1、思考过程:在讲“秒杀+分布式锁”解决商品超卖时候,我们并没有直接使用乐观锁的方式,而是采取了类似于乐观锁的一种解决方案,优化了SQL语句。超卖:在多个用户同时发起对同......