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

乐观锁和悲观锁

时间:2024-10-19 18:21:12浏览次数:5  
标签:场景 乐观 并发 加锁 悲观 数据

引言

乐观锁和悲观锁是并发控制中的两种重要机制,它们分别基于不同的假设和策略来处理多线程或多进程环境下的数据访问和修改问题。

一、悲观锁(Pessimistic Lock)


1.基本假设:

悲观锁假设在数据访问时冲突会频繁发生,因此每次访问数据时都会先加锁,以确保其他线程无法访问这段数据,直到操作完成后才释放锁。
2.实现方式:

在数据库中,悲观锁通常通过SQL语句实现,例如使用SELECT ... FOR UPDATE语句来锁定行,防止其他事务修改该数据。在编程语言中,悲观锁可以使用互斥锁(Mutex)或同步块(Synchronized Block)来实现。
3.适用场景:

悲观锁适用于对数据并发冲突非常敏感的场景,例如银行转账操作、库存扣减等需要严格数据一致性的操作。
4.优缺点:

优点:可以完全避免并发冲突,保证数据的一致性和完整性。
缺点:由于每次访问数据都需要加锁和解锁,会导致性能开销较大,特别是在并发量高的情况下,容易造成锁竞争和死锁问题。


二、乐观锁(Optimistic Lock)


基本假设:

乐观锁假设在数据访问时冲突不会频繁发生,因此不会主动加锁,而是在更新数据时进行检查,以确保数据的一致性。
实现方式:

乐观锁通常基于数据版本(Version)记录机制实现,即为数据增加一个版本标识。在读取数据时,将此版本号一同读出;在更新数据时,检查版本号是否变化,如果没有变化,则更新成功,否则重试或报错。常见的实现方式还包括使用时间戳(Timestamp)机制。
适用场景:

乐观锁适用于读多写少的场景,例如用户评论系统、社交媒体点赞等,这些场景下并发冲突概率较低。
优缺点:

优点:避免了频繁的锁操作,性能较好,适合读多写少的场景。
缺点:在高并发写操作的场景下,重试可能会频繁发生,导致性能下降。此外,需要开发人员显式管理版本控制机制,增加了开发复杂度。


三、悲观锁与乐观锁对比


锁定策略:悲观锁采取主动加锁的策略,以防止数据被其他线程修改;而乐观锁则采取不加锁的策略,而是在更新数据时进行检查。
性能开销:悲观锁由于每次访问数据都需要加锁和解锁,性能开销较大;而乐观锁则避免了锁带来的开销,但在高并发写操作时可能导致频繁重试。
适用场景:悲观锁适用于并发冲突频繁的场景;而乐观锁则适用于并发冲突较少的场景。

标签:场景,乐观,并发,加锁,悲观,数据
From: https://blog.csdn.net/indiansummer_/article/details/143081879

相关文章

  • 20_图解Elasticsearch内部如何基于_version进行乐观锁并发控制
    1、图解Elasticsearch内部如何基于_version进行乐观锁并发控制(1)_version元数据PUT/test_index/test_type/6{"test_field":"testtest"}{"_index":"test_index","_type":"test_type","_id":"6",&......
  • 21_上机动手实战演练基于_version进行乐观锁并发控制
    1、上机动手实战演练基于_version进行乐观锁并发控制(1)先构造一条数据出来PUT/test_index/test_type/7{"test_field":"testtest"}(2)模拟两个客户端,都获取到了同一条数据GETtest_index/test_type/7{"_index":"test_index","_type":"test_type"......
  • 22_上机动手实战演练基于external version进行乐观锁并发控制
    课程大纲1、上机动手实战演练基于externalversion进行乐观锁并发控制externalversiones提供了一个feature,就是说,你可以不用它提供的内部_version版本号来进行并发控制,可以基于你自己维护的一个版本号来进行并发控制。举个列子,加入你的数据在mysql里也有一份,然后你的应用系统......
  • 七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)
    七,MyBatis-Plus扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)@目录七,MyBatis-Plus扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)1.乐观锁2.代码生成器3.执行SQL分析打印4.总结:5.最后:1.乐观锁首先我们需要先了解开发中的一个常见场景,叫做并发请求。并......
  • 深入剖析 MyBatis-Plus:操作总结、对比与实践案例(CRUD 操作、分页、条件构造器、自动填
    MyBatis-Plus是MyBatis的增强工具,它极大简化了MyBatis的配置和操作,提高了开发效率。本文从基本操作到高阶用法,详细介绍了MyBatis-Plus的常见功能及与MyBatis的区别,并通过实际案例展示其强大的扩展能力。MyBatis-Plus基于MyBatis,但旨在减少开发者的代码量,增强可......
  • 【Java】并发编程的艺术:悲观锁、乐观锁与死锁管理
    目录一、乐观锁和悲观锁二、ReadWriteLock三、StampedLock四、Semaphore五、死锁的条件六、如何发现死锁七、如何避免死锁一、乐观锁和悲观锁        悲观锁(PessimisticLocking)具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此,在整......
  • 乐观的 UI:改善前端应用程序的用户体验
    在前端开发中,最大的挑战之一是提供流畅、快速的用户体验。现代用户期望应用程序能够立即响应,没有延迟或中断。这就是乐观ui.的概念发挥作用的地方什么是乐观用户界面?乐观ui,或乐观用户界面,是一种开发技术,其中应用程序立即假设用户操作成功并相应地更新界面,甚至在收到服务......
  • [官翻]mysqlbackup的乐观备份
    乐观备份可以用来提升备份和恢复体量比较大的数据库(只有少量的表经常变更)的性能。2)在大型数据库的热备份过程中(例如,以TB为单位),当备份进行时,可能会在服务器上生成巨大的重做日志文件。由于重做日志文件的增长速度快于mysqlbackup处理的速度,因此当mysqlbackup无法赶上重做日志周期,并......
  • [MySQL]实现乐观锁
    使用版本号在MySQL中,可以通过使用版本号(Version)来实现乐观锁。一种常见的实现方式是在表中增加一个版本号字段,每次更新数据时,都需要比对版本号。如果版本号一致,表示可以进行更新操作,否则表示其他事务已经修改了数据,需要进行相应的处理。下面是一个简单的示例,演示如何在MySQL......
  • MySQL锁机制揭秘:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁的全面解读
    MySQL有哪些锁1、按照锁的粒度划分行锁是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引,则加的行锁会自动升级为表锁,因为行锁是基于索引去进行操作的,所以想要加行锁,就......