如何选择悲观锁策略

悲观锁和乐观锁的区别及实现方式 乐观锁适用于读多写少的场景,可以提高并发性能,但需要处理数据冲突的情况。乐观锁的核心思想是假设不会发生并发冲突,因此在访问共享资源时不加锁,而是通过版本号或时间戳等机制判断数据是否被其他线程修改。互斥锁是最常见的悲观锁实现方式,它在访问共享资源之前会对资源进行加锁,其他线程在获取不到该锁之前,会被阻塞。悲观锁和乐观锁是在并发编程中常用的两种锁机制,用于解决多线程环境下的数据一致性问题。悲观锁的核心思想是假设会发生并发冲突,因此在访问共享资源之前,会先加锁,确保其他线程无法同时访问该资源。 阅读详情

1、无论是选择悲观锁策略,还是乐观锁策略。如果一个对象被上了锁,那么该对象都会受这个锁的控制和影响。如果这个锁是个排它锁,那么其它会话都不能修改它。

2、选择悲观锁策略,还是乐观锁策略,这主要是由应用和业务需求来确定的。如果你的应用和业务经常会出现从我看到要修改的记录的值,到我修改完成该记录这个时间段内,该记录有较大概率被其它会话所修改。换句话说就是,在我真正去做出修改时,这个记录的值很可能已经与我当初看到的不同了。那么这时,采取悲观锁策略,也许是更好的。而采取悲观锁策略的一个典型操作就是 select ... for undate。通过这种操作,使得从我一开始查看该记录起,这条记录就被上了排它锁,不允许其它会话再对该记录有任何修改。
相对的,如果你的业务和应用基本上很少出现这种情景,那么选择乐观锁策略也许就会更好。

3、这两种策略的核心其实就是持有锁的时间的起止点不同,悲观锁是从读取记录的那一刻就开始了,而乐观锁只从UPDATE那一刻开始;结束的点两者是一样的,都是发出commit或rollback命令。所以,悲观锁策略会使锁的持续时间更长,而乐观锁的持续时间则较短。其影响就是并发。悲观锁的并发性低于乐观锁。

4、无论是采用哪种策略,都要保证数据的完整性。所以,在采用乐观锁策略时,是有可能出现数据的不完整。举例来说:储户甲的存款余额100元,假设在几乎相同的时刻,发生了两笔业务,业务1为其存入了50元,另一个业务是其网上购物消费了30元。显然,这两个操作结束后,甲的存款余额应为120元(100+50-30)。但我们设想一下在数据库层面,可能出现这种情况,当其在银行柜台存入50元时,银行操作员收到了甲存入的50元现金,并通过 select 语句看到甲的当前余额为100元(其发出的指令是下面的语句:
select 余额 
   from 存款余额表
where 储户帐号=储户甲的银行帐号;)

,接着,发出指令 
update 存款余额表
      set 余额=150
    where 储户帐号=储户甲的银行帐号;

但就在其看到甲的余额为100元,到其修改甲的余额为150这期间,甲在网上的消费行为导致交易系统已经将甲的余额变成了70元(100-30)并提交了。当银行员工发出的指令也被提交后,甲的余额变成了150元,相当于甲网上消费的行为没有产生任何扣款。这显然是不正确的,更是要避免出现的。
如果这套系统采用的是悲观锁策略,那么在从银行员工查看甲当前余额的那一个时刻起(这时查询的指令就会是:
select 余额 
   from 存款余额表
where 储户帐号=储户甲的银行帐号 for update;)
该记录就已经被锁定了,这时甲网上消费的行为导致的交易系统从甲的帐户中扣减的操作就会处于等待状态。直至银行员工提交了相关指令,交易系统才能去扣减甲的钱款。这样,就可以确保甲的帐户余额是正确的。
悲观锁的策略显然可以保证业务的正确性和完整性。但再设想一下,如果甲在存款时,银行员工内急,或者储户甲说等一等,我要考虑一下是否再多存一些。那么,银行员工的操作就不会提交,这时网上交易系统对甲帐户的扣款操作就会一直处于等待状态,或者在等待一定时间后,返回一个扣款失败的提示。这对于系统的效率和客户来说,都不是一个好的体验。

5、因为考虑到乐观锁策略可以产生的这种问题,所以,我们在设计应用时,可以采取一些其它方法来避免上述情况的发生。其思想就是在真正提交时,确认要修改的数据没有变化过。主要的方法如下:
(1)、更新时带入原始的数据。
     update 存款余额表
      set 余额=150
    where 储户帐号=储户甲的银行帐号 and 余额=100;
(2)、在记录上增加修改的时间戳(也可利用ora_rowscn伪列)。即在事务开始时,获取该记录的时间戳,修改时,校验该时间戳,若一致则修改。

6、其实,我上面举的这个例子,如果在业务设计时,选择更新指令为
update 存款余额表
      set 余额=余额+50
    where 储户帐号=储户甲的银行帐号;
那么,即使是在乐观锁策略的情况下,依然可以保证数据的正确性和完整性。

 

Cadence IC618版图DRC验证License报错排查:从虚拟机网络配置到HOSTID的实战解析 本文详细解析了Cadence IC618版图设计中DRC验证License报错的排查方法,重点从虚拟机网络配置到HOSTID获取的实战经验。通过对比ifconfig与ip add命令的差异,提供了正确的HOSTID获取方式及License文件修改技巧,帮助工程师快速解决IC618环境下的DRC验证问题。 阅读详情

相关推荐

服务器基础知识介绍

服务器,不仅仅是一台高性能计算机,更是网络的核心节点,承担着网络服务的责任。然而,相较于普通计算机,服务器对于稳定性、安全性和性能等方面提出了更高的要求,这使得它们在数字化浪潮中傲然独立。在硬件成本结构中,CPU和芯片组占据约50%的成本,内存占15%,外部存储占10%,其余硬件约占25%。服务器的逻辑结构与普通计算机相似,但由于其需要提供高性能计算,对稳定性、可靠性、安全性、可扩展性和可管理性的要求更高。服务器的分类多种多样,根据产品形式可分为塔式服务器、机架服务器、刀片服务器和机柜服务器。

m0_73576645的博客 1881

oracle的悲观锁和乐观锁

目录 1 悲观锁 1.1 单表 for update 1.2 关联表for update 1.3 解除for update 锁的占用 1.4 悲观锁缺点 2 乐观锁 2.1 比对法 2.2 版本戳 2.3 timestamp型 2.4 例子Demo 问select *from person for update或update perso...

weixin_44900158的博客aa 2635

对称加密中GCM和CBC俩种加密模式的区别

**CBC(Cipher Block Chaining)** 和 **GCM(Galois/Counter Mode)** 是两种常见的对称加密模式。它们的主要区别体现在加密方式、性能和安全性上。

闲人 1107

七、Oracle 中的锁(适用于其他关系型数据库锁的分类)

Oracle 中常见锁的分类。 注意:死锁不属于程序自带的,它属于是程序逻辑不清造成的

Jack_Newer的博客 1886

用ESP32-S3和USB摄像头DIY一个无线图传监控(附完整代码和接线图)

本文详细介绍了如何利用ESP32-S3开发板和USB摄像头打造一套高性价比的无线图传监控系统。从硬件选型、接线图到代码实现,提供了完整的DIY方案,特别适合家庭监控、宠物看护等场景。通过优化WiFi传输和双核任务分配,实现了稳定的视频流传输,整套方案成本控制在200元以内。

weixin_33701251的博客 519

四、zabbix7.0推送告警至钉钉webhook机器人

2、钉钉的webhook是有安全要求的,我采用的是ip的方式,我的zabbix服务器在内网,我的网络出口有多个固定公网ip,所以这样做省事,其他方式也可以你自己考虑。下图是webhook机器人的配置。这一步,参数里面默认的跟我下图里不一样的,按我下图修改。Key是你的webhook机器人地址里的access_token=后面的内容。整个逻辑就是告警动作匹配告警媒介与用户,然后进行告警的发送。1、zabbix服务器能够访问钉钉的服务器,具体说是能访问。二、zabbix7配置报警媒介以及消息模板配置。

m0_74823715的博客 1293

Oracle数据库的乐观锁和悲观锁

这种锁定数据的方式带来的是性能的降低,因为在多用户并发访问的时候,当对一张表进行频繁操作时,会发现响应效率很低,数据库经常处于一种假死状态。在Oracle中,悲观锁需要利用一条现有的Connection,它分成两种方式,从SQL语句的区别来看,就是一种是select for update,一种是select for updatenowait的形式。乐观锁的主要实现方式是在数据读取的时候不进行锁定,而是在更新的时候判断在此期间有没有其他用户修改过这个数据。

pang12234的专栏 710

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 426

乐观锁与悲观锁的实现和区别

一、什么是乐观锁。 二、乐观锁的实现。 三、什么是悲观锁。 四、悲观锁的实现。 五、乐观锁和悲观锁的区别。 一、什么是乐观锁。 它假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数 据的冲突与否进行检测,如果发现冲突了,则返回用户错误的信息,让用户决定如何去做。 二、乐观锁的实现。 一般,乐观锁的实现都是基于数据版本号(少数情况是基于时间戳)。 使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新...

qq_52253798的博客 614

phaser3适配微信小游戏

phaser3适配微信小游戏

SilenzioX的博客 1803

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1391

MySQL 悲观锁与乐观锁的理解

悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段。 不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈。 一、悲观锁 顾名思义,就是对于数据的处理持悲观态度,总认为会发生并发冲突,获取和修改数据时,别人会修改数据。所以在整个数据处理过程中,需要将数据锁定。 悲观锁的实现,通常依靠数据库提供的锁机制实现,比如mysql的排他锁,select … for update来实现悲观锁。 例子:商品秒杀过程中,库存数量的减少,避免出现超卖的情况。 CREATE

weixin_46075832的博客 1799

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3655

【MySQL锁策略】乐观锁 vs 悲观锁:高并发场景下的生死抉择

考虑因素倾向悲观锁倾向乐观锁冲突频率高低数据一致性要求极高中等系统吞吐量不敏感要求高事务时长短事务长事务开发复杂度简单需处理重试黄金法则关键金融系统 → 悲观锁互联网高并发 → 乐观锁不确定场景 → 先测后选!在分布式系统中(如双11秒杀),如何实现乐观锁?欢迎在评论区分享你的方案!记住:技术选型没有对错,只有适合与否。理解业务场景,才能选择最佳锁策略!(本文示例基于MySQL 8.0,不同数据库实现可能略有差异)

全栈开发工程师 1232

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

乐观锁与悲观锁的深度对比

本文对比了乐观锁和悲观锁的核心思想、实现机制和性能特点。悲观锁假设并发冲突频发,通过加锁访问确保一致性,适合高冲突场景如金融交易;乐观锁假设冲突少见,通过版本号/CAS实现无锁访问,适合低冲突场景如库存扣减。两者在开销、吞吐量和死锁风险上各具特点,选择取决于冲突频率、重试成本和性能要求。实际应用中可混合使用,并需注意ABA问题、锁升级等特殊情况。现代系统倾向乐观锁,但金融等强一致场景仍需悲观锁。

weixin_47242663的博客 591

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于乐观锁和悲观锁

一、概念 悲观锁:总是假设最坏的情况,认为竞争总是存在,每次拿数据的时候都认为会被修改,因此每次都会先上锁。其他线程阻塞等待释放锁。 乐观锁:总是假设最好的情况,认为竞争总是不存在,每次拿数据的时候都认为不会被修改,因此不会先上锁,在最后更新的时候比较数据有无更新,可通过版本号或CAS实现。 二、两种锁的使用场景 悲观锁:用于写比较多的情况,避免了乐观锁不断重试从而降低性能 乐观锁:用于读比较多的...

weixin_41540084的博客 254

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

《多线程并发控制:选择正确的锁策略》:互斥锁、自旋锁、读写锁、乐观锁、悲观锁

本文围绕多线程并发控制中的锁策略展开讨论,详细介绍了互斥锁、自旋锁、读写锁、乐观锁以及它们的选择和使用场景。提出在确定被锁住代码执行时间很短时选择自旋锁,否则使用互斥锁;阐述了自旋锁在单核 CPU 和多核系统下的适用情况;深入解析了读写锁工作原理以及读优先锁、写优先锁、公平读写锁的特点和适用场景;最后说明了乐观锁适用于低冲突概率下的场景,但随着冲突概率上升,不适合使用乐观锁的原因。

weixin_73077810的博客 1291

乐观锁与悲观锁:高并发场景下的选择

在面对高并发的场景下,选择合适的锁策略对于保障数据一致性和提高系统性能至关重要。本文将深入探讨乐观锁和悲观锁两种常见的锁机制,分析它们在高并发环境中的优劣势,以便更好地选择适用于不同场景的锁策略。在实际应用中,乐观锁和悲观锁都有其适用的场景,选择应根据具体业务需求和并发访问的特点。在读多写少的情况下,乐观锁可以更好地发挥其性能优势;而在写多读少的情况下,悲观锁则更为适用。合理选择锁策略是高并发系统设计的关键一环,需要充分考虑业务场景和系统特性。

Micro麦可乐的博客 3842

什么是悲观锁?

数据库锁定:防止脏读和并发更新问题。分布式系统中的资源锁定:确保多个节点对共享资源的访问一致性。高并发场景下的资源访问控制:防止多个线程同时修改共享资源。需要严格控制资源访问顺序的场景:确保资源按顺序被访问。虽然悲观锁能有效防止数据不一致问题,但也带来了性能开销。在选择锁机制时,需要根据具体应用场景权衡性能和安全性,以便做出最佳决策。

qq_33326733的博客 1262

乐观锁和悲观锁 你更钟情于哪一个?

乐观锁和悲观锁 你更钟情于哪一个? 发表于23小时前| 1654次阅读| 来源Couchbase博客| 10 条评论| 作者Don Pinto 乐观锁悲观锁Couchbase 摘要:对数据库的并发访问一直是应用程序开发者需要面对的问题之一,一个好的解决方案不仅可以提供高的可靠性还能给应用程序的性能带来提升。下面我们来看一下Couchbase产品市场经理Don Pint

Cloud-Datacenter-Renewable Energy-Big Data-Model 582

数据库的乐观锁和悲观锁的理解和使用?

乐观锁和悲观锁是在并发访问数据库时用于处理数据一致性的两种不同策略。

NZC2237的博客 116

什么是乐观锁,什么是悲观锁

一、并发控制 当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。 没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。 常说的并发控制,一般都和数据库管理系统(DBMS)有关。在 DBMS 中并发控制的任务,是确保多个事务同时增删改查同一数据时,不破坏事务的隔离性、一致性和数据库的统一性。 实现并..

firstcode666的博客 1万+

什么是乐观锁,什么是悲观锁,有什么作用,该如何使用

然而,悲观锁需要频繁地进行加锁和释放锁的操作,增加了线程的切换开销和锁竞争的可能性,导致并发性能较差。然而,乐观锁需要依赖于CAS等机制来确保数据的一致性,而CAS操作可能会失败并导致重试,增加了一定的开销。需要注意的是,使用乐观锁时需要考虑数据一致性的问题,需要合理处理冲突和重试机制。综合来说,乐观锁和悲观锁是并发编程中的两种不同的锁策略,各自适用于不同的并发场景,可以根据具体需求选择合适的锁策略来保护共享资源的访问。读多写少的场景:当多个线程同时读取共享资源,而写操作较少发生时,可以使用乐观锁。

Li2992673708的博客 590

数据库悲观锁和乐观锁的区别

乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)是两种在数据库管理和并发控制中常用的策略,它们以不同的方式处理数据访问和修改时可能发生的冲突。下面将详细描述这两种锁的工作机制。选择悲观锁还是乐观锁取决于你的应用场景。悲观锁适合写操作频繁的场景,因为它可以减少数据冲突,但可能会增加等待时间和锁的竞争。乐观锁适合读多写少的场景,它减少了锁的开销,但在高并发写的情况下可能需要处理更多的冲突。

BOBO博客 1213

乐观锁和悲观锁

悲观锁适用于冲突频繁的场景,它通过立即加锁来避免冲突,但可能会降低并发性能。乐观锁适用于冲突较少的场景,它通过事后检查来处理冲突,可以提供更高的并发性能,但需要处理回滚的情况。在实际应用中,选择哪种锁策略取决于具体的业务需求和数据访问模式。有时候,系统可能会结合使用乐观锁和悲观锁,以适应不同的业务场景。

weixin_68174885的博客 1510

悲观锁和乐观锁

这篇文章讲解了悲观锁与乐观锁的区别,以及实现场景,不管是悲观锁还是乐观锁都是人们定义出来的概念,是一种思想。

wyd_88l的博客 943
上一篇: Oracle 乐观锁、悲观锁
下一篇: RocketMQ集群解决方案
aspnetandjava
博客等级 码龄16年 43粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值