一、概念上的区别

  乐观锁( Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步更新数据的时候再进行加锁。

  悲观锁(Pessimistic Lock):正如其名字一样,悲观锁对数据加锁持有一种悲观的态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

二、实现方式

乐观锁:

  version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
sql实现代码:

update table
set x=x+1, version=version+1
where id=#{id} and version=#{version};

  CAS操作方式:即compare and swap 或者 compare and set,
涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前
取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不
断的重试。

悲观锁:

  是由数据库自己实现的,要用的时候,我们直接调用数据库的相关语句就可以了(原理:共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程),如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

三、使用场景

乐观锁:

  比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

悲观锁:

  比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

四、特点

乐观锁:

  乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。

悲观锁:

  悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。

简而言之记得一句话:读取频繁使用乐观锁,写入频繁使用悲观锁。乐观锁不能解决脏读的问题。

最新文章

  1. ENode框架Conference案例分析系列之 - 文章索引
  2. 数据分析:中国高校更名历史 Python
  3. linux 学习基础7之脚本的练习
  4. 今天踩过的坑——structs和phpmyadmin
  5. python(六)面向对象
  6. python自动开发之第十三天
  7. Can't connect to local MySQL server through socket
  8. writev/readv
  9. Android-67-Tomcat启动出错:Server Tomcat v7.0 Server at localhost failed to start.
  10. 从尾到头打印链表--《剑指offer》
  11. Android 自己定义ScrollView ListView 体验各种纵向滑动的需求
  12. 前端HR告诉你—如何面试Web前端开发
  13. XJOI1652Matrix67的情书
  14. 团队作业8——第二次项目冲刺(Beta阶段)5.27
  15. plsql本机不安装数据库连接远程数据库
  16. vue菜鸟从业记:公司项目里如何进行前后端接口联调
  17. vue 图片下载到本地,图片保存到本地
  18. Putty的用法
  19. ui设计学习路线图分享送给初学者
  20. Steam安装Google Earth VR

热门文章

  1. 深入探究js中的隐式变量声明
  2. 阿里云服务器CentOS6.9 nexus私服使用
  3. springboot 使用i18n进行国际化乱码解决
  4. python爬虫——简易天气爬取
  5. ELK 学习笔记之 elasticsearch基本概念和CRUD
  6. 关于未来实现API管理系统的几个关键词
  7. 疑似网络抖动引起的RAC单节点宕机
  8. angular4 httpclient拦截器
  9. 02-19 k近邻算法(鸢尾花分类)
  10. 深入理解C#多线程 -戈多编程