悲观锁与乐观锁

Java 乐观锁与悲观锁 乐观锁与悲观锁的概念,之前有所讲解,这里用很小的篇幅进行知识的回顾,巩固;乐观锁与悲观锁的使用场景介绍,通过理解悲观锁与乐观锁不同的风格,理解什么场景下需要选择合适的锁,为本节的重点内容之一;了解乐观锁的缺点,乐观锁有自己的特定的缺陷,不同的锁都有自己的优点与缺点;了解乐观锁缺陷的解决方式,作为本节内容的重点之一;通过引入 Atomic 操作,实现乐观锁,为本节内容的核心,通过对比 synchronized 的实现,用两种锁机制实现同一个需求。 阅读详情

锁及事务隔离水平的关系

  1. 事务的隔离水平:指同时运行多个事务时,事务与事务之间的影响程度。其实是利用了各种类型的锁来解决并发问题,数据库内部基础机制,执行事务其实也在执行锁。(其他章有讲)

  2. 锁: 主要指悲观锁和乐观锁。

    只有当事务的隔离水平无法解决并发问题时,才需要手动设置锁。

                 |--共享所
         |--行锁-|
|--悲观锁-|       |--排它锁
|        |--表锁(不使用索引时)
|       
|--乐观锁
--排他锁
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;

--共享锁
SELECT * FROM table_name WHERE ... FOR UPDATE;

在事务中,关于锁的锁定,对于update、delete、insert,Innodb会自动加排它锁;
普通的select,不会加任何锁。我们可以显示的加共享锁或排它锁。

综合:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

悲观锁

悲观锁示例1:

//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以)

//1.查询出商品信息
select status from t_goods where id=1 for update;

//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);

//3.修改商品status为2
update t_goods set status=2 where …;

//4.提交事务
commit;/commit work;

上面的第一步我们执行了一次查询操作:select status from t_goods where id=1 for update;
与普通查询不一样的是,我们使用了select…for update的方式,这样就通过数据库实现了悲观锁。此时在t_goods表中,id为1的 那条数据就被我们锁定了,其它的事务必须等本次事务提交之后才能执行。这样我们可以保证当前的数据不会被其它事务修改。

说明:需要注意的是,在事务中,只有SELECT … FOR UPDATE 或LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般SELECT … 则不受此影响(事务里也能查到)。

拿上面的实例来说,当我执行select status from t_goods where id=1 for update;后。我在另外的事务中如果再次执行select status from t_goods where id=1 for update; 则第二个事务会一直等待第一个事务的提交,此时第二个查询处于阻塞的状态,但是如果我是在第二个事务中执行select status from t_goods where id=1;则能正常查询出数据,不会受第一个事务的影响。

行锁与表锁

MySQL select…for update的Row Lock与Table Lock

MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定索引(如主键),MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

1. 明确指出索引(如主键),查有数据,row lock

事务1:(console1)

mysql> select * from t_goods where id=1 for update;  
+----+--------+------+  
| id | status | name |  
+----+--------+------+  
|  1 |      1 | 道具 |  
+----+--------+------+  
1 row in set  

mysql>  

事务2:

mysql> select * from t_goods where id=1 for update;  

说明:事务1未提交,事务2将阻塞。长时间会报错。

2. 明确指出索引(如主键),查无数据,无lock

事务1:

mysql> select * from t_goods where id=3 for update;  
Empty set  

事务2:

mysql> select * from t_goods where id=3 for update;  
Empty set 

说明:查询结果为空,查询无阻塞,事务1无锁定

3. 没有用到索引、索引不明确(范围查),table lock

事务1:无索引时

mysql> select * from t_goods where name='道具' for update;  
+----+--------+------+  
| id | status | name |  
+----+--------+------+  
|  1 |      1 | 道具 |  
+----+--------+------+  
1 row in set  

mysql>  

事务2:

mysql> select * from t_goods where name='装备' for update; 

说明:无索引,事务1把整个表锁定了。查询这个表的其他字段也会阻塞。

事务1:(范围查时)

mysql> begin;  
Query OK, 0 rows affected  

mysql> select * from t_goods where id>0 for update;  
+----+--------+------+  
| id | status | name |  
+----+--------+------+  
|  1 |      1 | 道具 |  
|  2 |      1 | 装备 |  
+----+--------+------+  
2 rows in set  

mysql>  

事务2:

mysql> select * from t_goods where id>1 for update;  

说明:事务2会阻塞。当事务1提交后,事务2会查询出来。

注:①没有用到索引
      ②索引不明确,如 where id>1
将会表锁(table lock)。

乐观锁

乐观锁的实现方式

1. 使用数据版本(Version)

为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。

当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
以确保期间没有更新过。

update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};

2. 增加时间戳

在记录上增加修改的时间戳(也可利用ora_rowscn伪列)。即在事务开始时,获取该记录的时间戳,修改时,校验该时间戳,若一致则修改。(跟version差不多)

3. 更新时带入原始数据(见总结)。

悲观锁与乐观锁的对比

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

  2. 无论是采用哪种策略,都要保证数据的完整性。所以,在采用乐观锁策略时,是有可能出现数据的不完整。举例来说:储户甲的存款余额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元,相当于甲网上消费的行为没有产生任何扣款。这显然是不正确的,更是要避免出现的。

策略1:悲观锁

select 余额
   from 存款余额表
where 储户帐号=储户甲的银行帐号 for update;)

不足:当上述占时过长,会影响其他(如存钱、消费等)操作阻塞。

因为考虑到悲观锁策略可以产生的这种问题,所以,我们在设计应用时,可以采取一些其它方法来避免上述情况的发生。其思想就是在真正提交时,确认要修改的数据没有变化过。主要的方法如下:

策略2:乐观锁

(1)更新时带入原始的数据。

update 存款余额表
      set 余额=150
    where 储户帐号=储户甲的银行帐号 and 余额=100;

(2)在记录上增加修改的时间戳(也可利用ora_rowscn伪列)。即在事务开始时,获取该记录的时间戳,修改时,校验该时间戳,若一致则修改。
(3)其实,我上面举的这个例子,如果在业务设计时,选择更新指令为

update 存款余额表
      set 余额=余额+50
    where 储户帐号=储户甲的银行帐号;

那么,即使是在乐观锁策略的情况下,依然可以保证数据的正确性和完整性。

总结

在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法.

对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

彻底卸载Ubuntu双系统,并完美回收100G空间给D盘 本文记录了安全卸载Ubuntu双系统并回收磁盘空间的全过程。作者首先通过Windows命令行彻底清除Ubuntu启动项,避免GRUB引导报错;随后在磁盘管理中删除Linux分区,将100G未分配空间合并至相邻的D盘。针对C盘空间不足问题,作者采用Dism++清理系统文件,并将用户文档、聊天记录等迁移至扩容后的D盘。最终实现了引导纯净、空间合理分配的目标,特别强调分区扩展必须遵循"相邻原则",建议通过间接迁移而非直接扩容来优化系统盘空间管理。 阅读详情

相关推荐

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

悲观锁和乐观锁详解

乐观锁和悲观锁是并发控制的一种机制,用于多线程或多进程环境下对共享资源的访问管理,以防止数据不一致或竞态条件。它们的主要区别在于对待冲突的策略。

qq_53793319的博客 1万+

告别概念晕眩:用TC3xx SMU和TLF35584的配置实例,搞懂ASIL D功能安全落地

本文通过英飞凌TC3xx系列MCU的SMU模块与TLF35584电源管理芯片的协同配置实例,详细解析了如何实现符合ASIL D功能安全标准的刹车辅助ECU。文章涵盖SMU报警源配置、响应动作类型、TLF35584的安全状态管理,以及构建完整安全闭环的实践方法,帮助工程师将抽象的安全概念落地为具体设计方案。

weixin_30647065的博客 436

什么是悲观锁和乐观锁

一、何为悲观锁、乐观锁 1、悲观锁 顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchro...

striveb的博客 4万+

如何在不牺牲精度的前提下,把 YOLOv11 压缩到 Jetson 能跑的程度

YOLOv11 在目标检测任务中具备较强的准确性与多尺度鲁棒性,但其原始模型参数规模与计算量,对边缘设备来说并不友好,特别是面向 Jetson 这类资源受限的推理平台。本文基于实际部署场景,逐步拆解从结构层级改造、剪枝策略制定、量化导出流程,到 Jetson TensorRT 推理落地全过程。在不牺牲主干精度的前提下,最终实现 YOLOv11 推理延迟缩短 3 倍、模型体积压缩 4 倍、mAP 损失控制在 1% 以内的轻量化优化结果,并总结出一条可复用的工程路径,供工业界与边缘侧模型部署开发者参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2425

【华为OD技术面试手撕真题】25、验证IP地址 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

验证IP地址 华为od机试真题,华为OD技术二面,华为od机考,华为od手撕真题,华为od技术二面,华为od机试,华为OD机试的高频手撕代码题,华为od八股文

KJ.JK 4043

乐观锁和悲观锁

目录 一、基本概念 二、实现方式(含实例) 1、CAS(Compare And Swap) 2、版本号机制 三、优缺点和适用场景 1、功能限制 2、竞争激烈程度 四、面试官追问:乐观锁加锁吗? 五、面试官追问:CAS有哪些缺点? 1、ABA问题 2、高竞争下的开销问题 3、功能限制 一、基本概念 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。 乐观...

3928

JEDEC JESD51-14 瞬态双界面测试方法详解

(瞬态双界面测试方法,用于测量具有单路径热流的半导体器件的结到壳热阻 RθJC,包括结到壳顶部 RθJCT 和结到壳底部 RθJCB)。该标准于 2010 年发布(版本 JESD51-14.1),旨在提供一种准确、可重复的瞬态方法来测量功率半导体器件(如 MOSFET、IGBT)的结到壳热阻(RthJC),取代传统的稳态测量方法(如 MIL-STD-883E METHOD 1012.1)。方法,通过比较两种不同热界面材料(TIM)下的瞬态温度响应曲线,提取 RthJC,而无需直接测量壳温(Tc)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 604

乐观锁与悲观锁的根本区别,以及使用场景分析

乐观锁与悲观锁的根本区别,以及使用场景分析

kerwin的博客 2万+

知识图谱开发实战:搭建上市公司知识图谱(二)

搭建上市公司知识图谱(二)学习目标1. 获取上市公司公开数据1.1 获取上市公司列表与行业信息1.2 代码展示2. 从网站爬取上市公司网页并存储为 HTML文件2.1 准备环境2.2 爬取上市公司公开信息3. 解析HTML文件,获取高管信息并存储为 csv 文件4. 设计知识图谱数据库4.1 实体4.2 关系4.3 属性4.4 特殊4.5 代码5. 知识图谱数据库查询实战5.1 实战:按照neo4j的数据格式,转换CSV文件5.2 实战:使用neo4j-admin 导入数据5.3 实战:使用neo4j-b

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2093

YOLOv11低光照检测性能优化:基于Retinexformer主干网络的深度改进实践

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!@[TOC]在自动驾驶、安防监控、遥感探测等关键领域,目标检测系统必须保证24小时全天候的可靠工作。然而,现有最先进的目标检测模型,包括YOLOv11,其训练数据大多源于光照良好的场景。当环境光照条件急剧下降时,图像会出现严重的噪声、低对比度、颜色失真和细节丢失,直接导致模型性能断崖式下跌。常规的解决方案如图像直方图均衡化或简单的伽马校正,往往收效甚微,甚至可能放大噪声,进一步干扰检测。

m0_71589036的博客 189

面试必备之乐观锁与悲观锁

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。悲观锁通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。

JavaGuide 30万+

【DDR5 PCB走线SI/PI仿真调试】详细全攻略

问题场景发现症状优化措施过孔Stub效应TDR波形尖峰,信号反射严重使用盲孔,背钻减少Stub,降低Via数量串扰过大眼图闭合,误码率增加增加走线间距,插入地线隔离,减少平行长度电源阻抗过高PDN谐振导致纹波大多频率去耦,靠近电源引脚布置多档电容,合理分层信号时序失配优化走线长度匹配,避免信号走线跨层跳变DDR5设计不仅是硬件的挑战,更是仿真能力的考验。掌握SI/PI仿真,理解信号背后的物理本质,才能真正把握高速接口的“灵魂”!

weixin_43199439的博客 987

乐观锁与悲观锁

💡 在选择锁机制时,需根据具体业务场景、数据访问模式及性能需求来选择最佳策略。它们在数据一致性、性能及使用场景方面各有优势。🔎 CAS 操作会不断尝试更新值,直至成功,避免了锁的阻塞。:无锁操作,性能高,适用于竞争较少的场景。来判断数据是否被其他线程修改,避免加锁。:数据一致性强,适用于竞争严重的场景。会锁住查询到的行,防止其他事务修改。:确保在整个事务中数据一致性强;:锁的开销较大,易导致性能瓶颈。:数据冲突时,重试成本较高。:数据冲突时,重试成本较高。:锁开销较大,容易导致。:无锁操作,性能高;

Zero_pl的博客 799

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java悲观锁与乐观锁

Java悲观锁与乐观锁锁的目的实例悲观锁实现乐观锁实现总结 锁的目的 多线程编程如有共用资源的使用时,需要保证数据安全,资源需要同步处理。处理资源的手段可以有:互斥同步与非阻塞同步。实现分别对应:悲观锁与乐观锁。 实例 开20个线程进行计数,每个线程计算到10000。分别使用悲观锁与乐观锁来实现。 悲观锁实现 悲观锁是主要使用synchronized实现,通过锁住对应的对象,独占资源的方式。 de...

Richy的博客 5045

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

并发:乐观锁与悲观锁

何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子操作 CAS与synchronized的使用情景 何谓悲观锁与乐观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向...

Java Punk 1325

什么是乐观锁与悲观锁、乐观锁的缺点

数据库中的乐观锁和悲观锁用来解决什么问题? 用来解决不可重复读和幻读的。

本人的技术和文笔有限,正在努力成长中,请各位朋友多多指正与包涵! 847

【MySQL】中的乐观锁与悲观锁

为什么需要锁 在并发环境下,如果多个客户端访问同一条数据,此时就会产生数据不一致的问题,如何解决,通过加锁的机制,常见的有两种锁,乐观锁和悲观锁,可以在一定程度上解决并发访问。 乐观锁 乐观锁,顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步更新数据的时候在进行加锁,乐观锁的实现方式一般为每一条数据加一个版本号,具体流程...

chenchongg的博客 2304

一文彻底理解乐观锁与悲观锁

通过阅读本文可以获得什么 1、什么是乐观锁? 2、乐观锁实现方式都有什么? 3、乐观锁优缺点有哪些? 4、乐观锁适用场景? 5、什么是悲观锁? 6、悲观锁实现方式有哪几种? 7、悲观锁优缺点? 8、悲观锁的适用场景? 首先,我们先看一下什么是乐观锁,在我个人理解,乐观锁可以抽象为去银行取钱,假如银行没有人排队,所以不需要取号,直接去柜台A就可以办理业务。反之悲观锁就是假如去银行取钱,每次去都好巧不巧的都有人在柜台A排队,所以此时需要取号,然后等叫号在去柜台A办理业务。(假设银行只有一个柜台A,不..

醉鱼的博客 3027

Mysql乐观锁与悲观锁的区别

05 mysql-乐观锁与悲观锁的区别 文章目录1、悲观锁2、乐观锁3、两种锁的使用场景4、乐观锁常见的两种实现方式4.1、 版本号机制4.2、 CAS算法5、乐观锁的缺点5.1、 ABA 问题5.2、 循环时间长开销大5.3、 只能保证一个共享变量的原子操作 1、悲观锁 ​ 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数...

时光、疏离了记忆づ童话的博客 2679

乐观锁,悲观锁与Golang

悲观锁 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适

月守护的博客 1954

面试题总结——乐观锁与悲观锁

面试题总结——乐观锁与悲观锁  一、乐观锁与悲观锁对比   1.悲观锁    共享资源每次只给一个线程使用,其他线程阻塞,需等到当前线程使用完后才能使用(总是假设最坏的情况,每次拿到数据后都会认为别人会修改该数据,因此每次拿数据时都会上锁,阻塞其他人)    MySQL中的锁机制:行锁,表锁,读锁,写锁;Java中的synchronized和ReentrantLock独占锁。   2.乐观锁   ...

xiaoaxiao 1549

Redis 悲观锁与乐观锁

答:避免误删锁问题。如果直接用 DEL 命令,可能出现:客户端 A 获取锁后超时,锁自动释放,客户端 B 获取锁,此时客户端 A 执行 DEL 会删除客户端 B 的锁。思想:悲观地认为每次操作数据都会发生并发冲突,因此在操作数据前,必须先获取锁,确保同一时间只有一个客户端能操作该数据,其他客户端需等待锁释放后才能执行。为了解决分布式场景下的并发冲突,Redis衍生出了悲观锁和乐观锁两种核心锁机制,二者的设计思路完全相反,适用于不同的并发场景。如果版本号不一致,说明数据已被修改,放弃当前更新或重试。

2402_83493359的博客 1278
上一篇: Lucene(1)
下一篇: jvm(1)深入理解java虚拟机笔记
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值