美文网首页技术分享
乐观锁和悲观锁的使用场景

乐观锁和悲观锁的使用场景

作者: 小胖学编程 | 来源:发表于2019-09-16 18:15 被阅读0次

悲观锁和乐观锁只适用于更新操作。

使用哪种机制,取决于你的场景,本质上原则和目标:提高写效率。

悲观锁是避免冲突,乐观锁是检验冲突。

若存在大量冲突的情况下,使用悲观锁的效率会更高。

概念

悲观锁:每次改变数据时,都担心数据被修改。故在悲观锁的环境中,在改变对象之前就将该对象锁住,直到你提交更改后才释放锁。悲观锁的缺点在于可能会长时间限制其他用户的访问,也就是说悲观锁的并发访问性不好。

乐观锁:每次更改数据时,不担心数据被修改。因此乐观锁在提交更改时才会将对象锁住,当读取或改变对象时并不加锁。可见乐观锁加锁时间比悲观锁短,乐观锁加锁粒度比较小。但是在你提交改变时,发现对象已经被改变,于是你不得不重新读取该对象并作出改变(自旋操作)这说明在乐观锁环境中,会增加并发用户读取对象的数量。

如何抉择

乐观锁可以提供并发访问的效率,但是如果出现了冲突只能向上抛出,然后重来一遍;悲观锁可以避免冲突的发生,但是会降低效率。

选择使用哪一种锁取决于冲突频率一旦发生冲突的严重性。如果系统并发访问冲突的频率很低或者冲突发生后的后果并不严重(所谓后果应该就是被检测到冲突的提交会失败,必须重来一次),可以使用乐观锁,否则使用悲观锁。

适用场景

实际上,无论是悲观锁还是乐观锁,都是update(行级锁)操作。悲观锁语法是select * from table for update预先加锁,防止其他用户访问。而乐观锁,本质上是检测冲突(检测是否发生改变),而非预防冲突。一般使用版本号控制。

一般来说,我们业务操作,一般在接受请求后,登记流水表(状态"未处理")。而在响应的时候,需要更新流水表(一个条件便是状态),此时便是使用了乐观锁:在提交改变时检测是否冲突

相关文章

  • 面试题记录three

    SpringMVC运行原理 如图所示: 2.springbean 生命周期 3.乐观锁和悲观锁及使用场景 悲观锁 ...

  • 面试官一次次问Java的锁时,你是怎么回答的?80%的人都说不完

    乐观锁与悲观锁 乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是两种完全不同的思想。它们的使用非常广泛...

  • 关于java中的锁的理解

    乐观锁与悲观锁 乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是两种完全不同的思想。它们的使用非常广泛...

  • Mysql锁

    按照使用方式,锁分为: 悲观锁 乐观锁 乐观锁 概念就不细讲了,乐观锁和悲观锁的区别是乐观锁是假设在修改数据之前,...

  • 深入理解锁机制(Java)

    Java提供了丰富种类的锁,在适当的场景使用合适的锁能够展现出非常高的效率。常用到的锁就有乐观锁和悲观锁。 乐观锁...

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

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

  • 乐观锁和悲观锁

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

  • 锁的概述

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

  • 乐观锁和悲观锁

    目录 乐观锁和悲观锁是什么/可以被用在什么样的场景下? 乐观锁和悲观锁的区别? 引用一段比较经典的描述 “数据库...

  • 并发参数

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

网友评论

    本文标题:乐观锁和悲观锁的使用场景

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