概念上区别

乐观锁(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的思想也是悲观锁。

使用场景

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

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

开放下载!阿里巴巴高效开发的秘籍,116页DevOps实践手册​mp.weixin.qq.com

特点

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

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

sql实现代码和案例

作者:java劝退师图图

mysql锁总结知乎_Mysql悲观锁乐观锁区别与使用场景相关推荐

  1. mysql悲观群_谈谈mysql的悲观和乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...

  2. mysql锁机制(共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX)的关系,死锁,乐观锁,悲观锁...)

    1. 锁的基础与行锁的特点 1.1 概念 在开发多用户.数据库驱动的应用时,相当大的一个难点就是解决并发性的问题,目前比较常用的解决方案就是锁机制. 锁机制也是数据库系统区别于文件系统的一个关键特性. ...

  3. mysql 开启事物_redis系列之——事物及乐观锁

    学习mysql的时候,我们常说mysql是有事物的,事物有ACID四个特性,原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability) ...

  4. mysql 压力测试知乎_MySQL 对于千万级的大表要怎么优化? - MySQL

    很多人第一反应是各种切分:我给的顺序是: 第一优化你的sql和索引: 第二加缓存,memcached,redis: 第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高, ...

  5. 轻量级锁_一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁 不看后悔系列...

    重量级锁?自旋锁?自适应自旋锁?轻量级锁?偏向锁?悲观锁?乐观锁?执行一个方法咋这么辛苦,到处都是锁. 今天这篇文章,给大家普及下这些锁究竟是啥,他们的由来,他们之间有啥关系,有啥区别. 重量级锁 如 ...

  6. 乐观锁和悲观锁的理解及如何实现,乐观锁的实现方式。看完你就明白了!

    文章目录 前言 面试回答话术: 乐观锁的实现方式: CAS缺点: 悲观锁和乐观锁 2.1.悲观锁 2.2.乐观锁 前言 在了解悲观锁和乐观锁之前,我们先了解一下什么是锁,为什么要用到锁? 技术来源于生 ...

  7. python乐观锁代码实现_Elasticsearch系列—并发控制及乐观锁实现原理

    概要 本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理,列举常见的电商场景,关系型数据库的并发控制.ES的并发控制实践. 并发场景 不论是关系型数据库的应用,还是使用Elasti ...

  8. mysql 压力测试知乎_MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0

    版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实 ...

  9. mysql 压力测试知乎_MySQL查看SQL语句执行效率和mysql几种性能测试的工具

    网络中整理,记录下,朋友们应该用得到! Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮 ...

最新文章

  1. 最大熵的Java实现
  2. 兰州计算机速成班都学什么,兰州当众讲话速成班
  3. 【CyberSecurityLearning 4】NTFS安全权限及文件共享服务器
  4. [导入]《交互设计之路——让高科技产品回归人性》读书笔记(一)
  5. 剑灵力士卡刀ahk_技术宅教你:召唤代码一键卡刀详细教程帖
  6. java中Date()类型输入数据的处理
  7. .net平台的MongoDB使用
  8. 纯js监听滚动条到底部(vue版)
  9. sql中的while循环_SQL While循环:了解SQL Server中的While循环
  10. java版我的世界光追,老瓶装新酒 光追版《我的世界》将至你心动了吗
  11. 【转】 Android常用实例—Alert Dialog的使用
  12. JDK7集合框架源码阅读(五) Hashtable
  13. 在域中使用组策略允许用户关闭计算机以及更改系统时间
  14. SW小技巧2:将属性链接到 SOLIDWORKS 工程图的简便方法
  15. matlab 三维图形改变线宽,用PANDAS改变线宽绘制三维线图
  16. 计算机相关的oa资源,计算机类OA期刊搜集与分析.pdf
  17. 无法直接打开jar文件,提示“你要以何种方式打开.jar文件”(已解决)
  18. 用html做龙卷风特效,利用HTML5实现Canvas龙卷风特效
  19. 12345政府热线报告
  20. php.ini afm,nanoscope analysis(AFM数据处理软件) v1.5 官方安装免费版(附安装教程)

热门文章

  1. LeetCode简单题之检查整数及其两倍数是否存在
  2. deeplearning模型分析
  3. TinyML-TVM是如何驯服Tiny的(下)
  4. 什么是智能医院?如何构建自己的解决方案?
  5. Android中Service生命周期、启动、绑定、混合使用
  6. 2021年大数据ELK(二十):FileBeat是如何工作的
  7. Laravel和Thinkphp有什么区别,哪个框架好用
  8. Django 全文检索6.3
  9. Java 数据类型转换
  10. Error:(17, 0) SDK location not found. Define location with sdk.dir in the local.properties file or w