美文网首页
详解什么是悲观锁和乐观锁

详解什么是悲观锁和乐观锁

作者: X兄 | 来源:发表于2019-04-17 23:07 被阅读0次

详解什么是悲观锁和乐观锁?

悲观锁和乐观锁是面试时必问的,也是开发过程中重要的知识点,是作为一个程序员必须要掌握的,那么你知道什么是悲观锁和乐观锁吗?

悲观与乐观:

  • 悲观认为世界变幻无常,人注定要遭受苦难,因而陷入悲观绝望,甚至认为生不如死,什么事情都往不好的方面想.,很消极.
  • 乐观泛指对宇宙、社会、人生充满信心和希望的态度、观点和理论。在伦理学说史上,对什么事情都保存乐观、积极向上的态度

那么悲观锁和乐观锁呢?
悲观锁和乐观锁和悲观与乐观的意思差不多

  • 悲观锁: 就像是有悲观消极的态度,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁
  1. 悲观锁假定会发生并发冲突的可能,于是屏蔽一切可能违反数据完整性的操作

  2. Java synchronized就是悲观锁的其中一种,每次线程要修改数据的时候都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block.

  • 乐观锁: 就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用加字段比较的方法,如版本号等机制。乐观锁适用于读多写少的应用类型,这样可以提高吞吐量.

详解什么是版本号机制:
版本号机制:
这是乐观锁最常用的一种实现方式,就是在数据库表增加一个数据类型为"version"的字段来实现.
当读取数据的时候,将version字段的值一同读出,数据每更新一次,version的值就加一.当你提交更新的时候,判断数据库表对应的版本version值与第一次取出来的version值进行比对,如果值相同,则允许更新,否则认为是过期的数据.

悲观锁的使用格式:
SELECT…FOR UPDATE
例:select * from db where name="li" for update

这条 sql 语句锁定了 db 表中所有符合检索条件( name=“li” )的记录。 本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。

格式 SELECT…FOR UPDATE NOWAIT

该关键字的含义是“不用等待,立即返回”,如果当前请求的资源被其他会话锁定时,会发生阻塞,nowait可以避免这一阻塞。

两种锁的使用场景:
乐观锁: 多读写少
悲观锁: 多写读少

相关文章

  • 一文简介乐观锁和悲观锁

    悲观锁和乐观锁的概念 乐观锁和悲观锁在面试过程中是经常遇到的,那么什么是乐观锁什么是悲观锁呢?首先需要明确的是乐观...

  • 锁的概述

    乐观锁与悲观锁 悲观锁 乐观锁和悲观锁的概念出自数据库,但在java并发包中也引入和类似的概念(乐观锁/悲观锁是一...

  • 看完你就知道的乐观锁和悲观锁

    看完你就知道的乐观锁和悲观锁 Java 锁之乐观锁和悲观锁 [TOC] Java 按照锁的实现分为乐观锁和悲观锁,...

  • CAS 与原子操作

    乐观锁与悲观锁 锁可以从不同的角度分类。其中,乐观锁和悲观锁是一种分类方式。 乐观锁:乐观锁又称为“无锁”。乐观锁...

  • 详解什么是悲观锁和乐观锁

    详解什么是悲观锁和乐观锁? 悲观锁和乐观锁是面试时必问的,也是开发过程中重要的知识点,是作为一个程序员必须要掌握的...

  • 乐观锁和悲观锁

    参考来源 深入理解乐观锁与悲观锁 乐观锁的一种实现方式——CAS mysql乐观锁总结和实践 乐观锁和悲观锁 悲观...

  • 图文并茂,这可能是史上最清晰易懂的悲观锁和乐观锁

    这是一篇介绍悲观锁和乐观锁的入门文章。旨在让那些不了解悲观锁和乐观锁的小白们弄清楚什么是悲观锁,什么是乐观锁。不同...

  • 怎么彻底理解悲观锁与乐观锁?来,图文并茂轻松理解!

    这是一篇介绍悲观锁和乐观锁的入门文章。旨在让那些不了解悲观锁和乐观锁的小白们弄清楚什么是悲观锁,什么是乐观锁。不同...

  • 图文并茂的带你彻底理解悲观锁与乐观锁

    这是一篇介绍悲观锁和乐观锁的入门文章。旨在让那些不了解悲观锁和乐观锁的小白们弄清楚什么是悲观锁,什么是乐观锁。不同...

  • 并发参数

    悲观锁与乐观锁 悲观锁 synchronized和ReentrantLock等独占锁就是悲观锁思想的实现乐观锁一般...

网友评论

      本文标题:详解什么是悲观锁和乐观锁

      本文链接:https://www.haomeiwen.com/subject/mbtawqtx.html