mysql中的悲观锁和乐观锁

【MySQL笔记】正确的理解MySQL的乐观锁,悲观锁与MVCC 正确的理解MySQL的乐观锁,悲观锁与MVCC !首先声明,MySQL的测试环境是5.7 前提概念 数据库并发的三种场景 乐观锁和悲观锁的澄清 悲观锁 乐观锁 MVCC多版本并发控制 总结 乐观锁和悲观锁的抉择 OCC,PCC,MVCC 参考资料 前提概念 数据库并发的三种场景 数据库并发场景有三种,分别为: 读-读:不存在任何问题,也不需要并发控制 读-写:有隔离性问题,... 阅读详情

乐观所和悲观锁策略

  • 悲观锁:在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续 。
  • 乐观所:读取数据时不锁,更新时检查是否数据已经被更新过,如果是则取消当前更新,一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁

1.悲观锁:

在mysql中实现悲观锁的方式:select * from ...for update

<select id="getForUpdate" parameterType="String" resultType="ContractVO">
		select 
			<include refid="column_list"/> 
		from t_contract a
			<include refid="column_join"/>
		 where a.id = #{0} for update
	</select>

service层代码:其中getDataById查询语句sql中没有for  update ,getForUpdate查询语句中带有for  update

@Override
	@Transactional
	public void getForUpdate(String id) throws Exception {
		
		ContractVO contractVO = dao.getDataById(id);
				//dao.getForUpdate(id);
		if(Integer.parseInt(contractVO.getContractType()) > 0){
			contractVO.setContractType(String.valueOf(Integer.parseInt(contractVO.getContractType()) + 1));
			dao.update(contractVO);
		} else {
			throw new Exception("更新失败");
		}
	}

controller层代码:

@RequestMapping(value = "testUpdate")
	@ResponseBody
	public ResultMsg<Object> testUpdate(String id){
		ResultMsg<Object> rs = new ResultMsg<Object>();
		for(int i=0;i<27;i++){
			new Thread(() ->{
				try {
					iContractService.getForUpdate(id);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					log.error(e.getMessage());
				}
			}).start();
		}
		return rs;
	}

在数据库中有一个原始值为1的字段,按照正常情况下27条线程执行完后的值应该为28.

使用postman测试,如果service中使用getDataById查询,那么数据库中得值不定。

如果使用getForUpdate查询,则执行完成后,数据库中的值为28。由此可以证明加锁成功。

2.乐观锁

乐观锁的实现机制是在表中加一个字段当做版本号,每次更新的时候去判断你获取到的这个值是不是等于数据当前存的值,如果两个值不一样,那么证明当前更新的数据不是最新的。

sql如下:

update table set content = #{content},edit = edit +1 where id = #{id} and edit = #{edit}

sercive层代码:

@Override
	@Transactional(rollbackFor = Exception.class)
	public void getForUpdate(String id) throws Exception {
		
		ContractVO contractVO = dao.getDataById(id);
				//dao.getForUpdate(id);
		if(Integer.parseInt(contractVO.getContractType()) > 0){
			contractVO.setContractType(String.valueOf(Integer.parseInt(contractVO.getContractType()) + 1));
			int count = dao.update(contractVO);
			if(count == 0){
				throw new Exception("更新失败");
			}
		}
	}

count为更新的行数,当更新行数为0时,抛出异常。

MySql的乐观锁和悲观锁 悲观锁:悲观锁(Pessimistic Lock),顾名思义就是很悲观.每次去操作数据的时候,都会认为别人会修改.所以为了防止别人修改,就在操作的时候上锁.这样别人来访问的时候就会阻塞在那里直到锁被是释放.传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁.使用场景: 商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单的时候必须确保该商品status为1.假设商品id为1.# e 阅读详情

相关推荐

STM32HAL库 基于外部Flash+FatFs模拟U盘方式进行固件拷贝升级(详解)

STM32HAL库 基于外部Flash+FatFs模拟U盘方式进行固件拷贝升级

qq_36075612的博客 1万+

for update的使用

一、for update定义 for update是一种行级锁,又叫排它锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。 只有当出现如下之一的条件,才会释放共享更新锁: 1、执行提交(COMMIT)语句 2、退出数

felix 3161

SpringBoot 中 @RequestMapping 及衍生注解的全面解析与实践

本文全面解析Spring Boot中@RequestMapping及其衍生注解的使用,涵盖核心功能、HTTP方法特定注解(@GetMapping/@PostMapping等)、属性详解(路径/参数/头信息等)以及路径变量处理。文章详细介绍了注解的组合使用、继承特性、版本控制策略等高级应用,并针对405/404等常见错误提供解决方案。通过学习这些注解的规范用法,开发者能够构建符合RESTful风格的API接口,提升代码可读性和可维护性。建议优先使用HTTP方法特定注解,合理规划URL结构,并注意避免路径冲突。

Java&AI小吕布的博客 2037

到底什么时候用FOR UPDATE合适?

1.forupdate的使用场景 `如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用forupdate的。 比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要forupate进行数据加锁防止高并发时...

狗子博客 1万+

【深度学习3】ubuntu22.04从零开始搭建深度学习环境

ubuntu22.04从零开始搭建深度学习开发环境

weixin_43387635的博客 1万+

基于STM32和K210的自动驾驶小车设计

自动驾驶技术正在迅速发展,成为了汽车行业和智能交通领域的热点之一。随着科技的发展,STM32和K210这两款芯片为自动驾驶小车提供了优秀的硬件支持。本文我们将学习如何使用STM32和K210打造一个简单的自动驾驶小车。提示:以下是本篇文章正文内容,下面案例可供参考通过这篇文章,掌握了如何使用STM32和K210构建一个简单的自动驾驶小车。通过了解基本的电路设计,并编写了STM32和K210的代码。通过这个例子,可以更好地理解如何在嵌入式系统中使用STM32和K210,以及如何实现自动驾驶小车的简单功能。

Kyle_Chan_zMH的博客 2216

For update 与for update nowait/wait 小解

For update 与for update nowait/wait 小解   1、FOR UPDATE 和FOR UPDATE NOWAIT 的区别: 首先一点,如果只是SELECT 的话,Oracle是不会加任何锁的,也就是Oracle对SELECT 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据(并非排它锁),并且修改的结果可能影响到你目前SELECT语句的结

demonson的专栏 5572

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 551

你真的懂for update?(面试必备)

一: 使用场景 一: 使用场景 (一) : 你是否在开发中会经常遇到下面的疑惑呢?     1、某段代码在并发的情况下可能会出现并发问题,该用什么方式来防止这种情况的出现呢?     2、可能你了解到可以使用Synchronized关键字来处理,但是Synchronized是通过悲观锁来实现的,你还会考虑到如果锁的范围太大,会很因影响到代码执行的效率,同时,Synchronized只适用于单机版,如果存在集群情况下(现在都流行

1万+

scratch绘制旋转彩球 2023年9月电子学会图形化编程scratch编程等级考试四级真题和答案解析

​ scratch绘制旋转彩球 2023年9月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 1、准备工作 (1)删除小猫角色,从角色库选择Ball角色; (2)默认空白背景。 ​

青少年编程学习指导 1367

Vue2 - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,vue实现vr看720度全景效果方案讲解及示例代码(兼容电脑PC网页+手机H5移动端页面)

vue全景VR图,vue h5实现全景720预览,vue加载720全景图_vue怎么加载vr图片,vue实现vr全景看房,vue2实现全景效果,加载很慢卡怎么办,实现全景预览的插件,vue显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于vue实现vr全景预览,加载全景图,vue全景预览pannellum插件,vue实现3D全景图,实现720°全景图展示,在VUE 中使用three.js实现全景视频播放,vue项目中使用photo-sphere-viewer实现vr720度

🏆 前端领域优质创作者 3317

Rocksdb的事务(二):完整事务体系的 详细实现

rocksdb 基本隔离级别实现 以及 并发场景的冲突解决方案。

天行健,地势坤 5410

从 Integrated Configuration 到 Integration Flow,SAP PI/PO 老配置迁移的一次温和重构

很多还在运行 SAP PI/PO 的系统,Integration Directory 里都积累了不少 Integrated Configuration,也就是日常项目里常说的 ICO。它们可能稳定运行了多年,负责把采购订单、物料主数据、客户主数据、发票、发货通知从一个系统送到另一个系统。问题在于,ICO 这种对象很实用,却不够直观。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 95

MySql悲观锁(行锁)和乐观锁

一、悲观锁VS乐观锁 引言 为什么需要锁(并发控制) 在并发的环境中,会存在多个用户同时更新同一条数据,这时就会产生冲突。 冲突结果: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。 因此为了解决上述问题,引入了并发控制机制。 乐观锁(乐观并发控制)和悲观锁(悲观并发控制)是并发控制的主要手段,其实不仅关系型数据库中有乐观锁和悲观锁的概念,像redis,memcached等都有类似的概念。所以,不要把乐观.

Java后端技术栈 3万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

mysql乐观锁和悲观锁

对比维度悲观锁乐观锁冲突假设相信“会冲突”相信“很少冲突”控制方式先加锁,再操作不加锁,提交时校验版本读写关系写时阻塞其他读/写(视锁类型而定)读写通常不互相阻塞失败代价一般不会失败(除死锁或异常)可能更新失败,需要重试或提示实现位置多在数据库层(行锁、表锁等)多在业务/应用层(version 字段、CAS 等)

zhiyuanIT的专栏 1481

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL 中的乐观锁与悲观锁

乐观锁和悲观锁是 MySQL 中两种重要的并发控制机制,它们各自适用于不同的应用场景。在实际开发中,需要根据业务需求、数据读写比例以及对数据一致性的要求等因素,合理选择使用乐观锁或悲观锁,以确保数据库系统在高并发环境下能够稳定、高效地运行,同时保证数据的完整性和一致性。

weixin_69477306的博客 2891

Devexpress16.2.6破解工具

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

MySQL的乐观锁、悲观锁机制及实现

乐观锁是一种并发控制策略,它假设多个事务不会发生冲突,在执行操作时不加锁,非常乐观,只需每次进行提交时利用标识进行对比,确认其他事务没修改过便可提交。悲观锁认为每次操作都会发生冲突,非常悲观。它会在任何可能发生冲突的地方进行加锁,其他操作想修改都需要等它执行完后释放锁,再通过争抢到锁而进行操作。

m0_61925586的博客 3020

MySQL 的乐观锁和悲观锁是什么?

在 MySQL 中,和是两种不同的并发控制机制,用于解决多用户/事务同时操作数据时的冲突问题。

篱笆院的狗的博客 1465

mysql的悲观锁和乐观锁

mysql的并发操作时而引起的数据的不一致性(数据冲突): 丢失更新:两个用户(或以上)对同一个数据对象操作引起的数据丢失。     解决方案:1.悲观锁,假设丢失更新一定存在;sql后面加上for update;这是数据库的一种机制。          2.乐观锁,假设丢失更新不一定发生。update时候存在版本,更新时候按版本号进行更新。 一、乐观锁 乐观锁不是数据库自带的,需要我们...

jaryle的专栏 1万+

MySQL中的乐观锁和悲观锁具体怎么实现的?

文章介绍 对于MySQL中的乐观锁和悲观锁,可能很多的开发者还不是很熟悉,并不知道其中具体是如何实现的。本文就针对这个问题做一个实际案例演示,让你彻底明白这两种锁的区别。 相关文章 之前针对MySQL中的锁单独分享过一篇文章,对于MySQL锁还不够了解的可以仔细阅读以下该文。 锁分类 MySQL的中锁按照范围主要分为表锁、行锁和页面锁。其中myisam存储引擎只支持表锁,InnoDB不仅仅支持行锁,在一定程度上也支持表锁。按照行为可以分为共享锁(读锁)、排他锁(写锁)和意向锁。按照思想分为乐观锁和

m0_58559010的博客 3540

mysql 悲观锁和乐观锁区别

1、mysql悲观锁:在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,依靠数据库提供的锁机制,每次会申请锁并加锁和解锁操作 第一步:两个终端均关闭自动提交 左边: 右边: 第二步:左边利用 select .... for update的悲观锁语法锁住记录 select * from employee where id = 1 for update; 第三步:右...

感冒石头的博客 2531

mysql默认使用悲观锁_mysql乐观锁和悲观锁详解

mysql乐观锁和悲观锁详解相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了。那么乐观锁和悲观锁到底是个什么东西,用它能来做什么呢?相信大家都遇到这种场景,当很多人(一两个人估计不行)同时对同一条数据做修改的时候,那么数据的最终结果是怎样的呢?这也就是我们说的并发情况,这样会导致以下两种结果:更新错误...

weixin_35615322的博客 2603

MySQL 的悲观锁和乐观锁如何使用?

当今是分布式架构的天下,在这种架构当中存在着各式各样的锁:大到分布式锁,小到代码的锁,还有数据库的锁。尽管这些各不相同的锁令人头疼,我们对锁的语义却都是相同的: 同一时刻只有获取锁的线程可以运行,其他线程必须等到锁释放才有可能执行。 从上面的定义我们可以看出锁是作用于线程的,并且是排他的。此外要注意以上定义是针对写入操作的,对于读取操作并不适合,因为读取的情况往往不需要锁。 今天我们的主题是 MySQL 的锁,首先我们需要知道 MySQL 的锁在这么多“锁”之中处于什么样的地位。只有认清楚 MySQL

奇点 3126

MYSQL悲观锁及乐观锁

如果在执行更新操作之前,其他事务修改了该用户的余额值,那么执行该更新语句时不会更新任何数据。举个例子,假设有一个银行转账的业务场景,其中涉及到两个账户的金额操作,为了避免数据冲突和并发问题,可以采用悲观锁来实现。在这个例子中,通过LOCK TABLES语句将整个订单表加锁,确保其他事务无法对其进行修改,然后执行更新操作,最后使用UNLOCK TABLES语句释放锁。需要注意的是,悲观锁机制在实现上通常需要使用到数据库的锁机制,因此在高并发场景下可能会导致性能瓶颈和死锁问题,所以需要谨慎使用。

lonely_baby的博客 2322

Mysql悲观锁和乐观锁

悲观锁:“防患于未然”,用锁阻塞冲突,适合写密集、强一致性场景,实现简单但性能低;乐观锁:“事后补救”,用版本号校验冲突,适合读密集、低冲突场景,性能高但业务层复杂;冲突概率高用悲观,冲突概率低用乐观,无绝对优劣,需结合业务场景权衡。

2502_92141759的博客 592

MySQL 乐观锁与悲观锁

悲观锁(Pessimistic Locking)是一种保守的并发控制方法,它假设在事务执行过程中,可能会有其他事务对同一数据进行修改,因此在读取数据时就对数据进行加锁,以防止其他事务的干扰。乐观锁(Optimistic Locking)是一种相对乐观的并发控制方法,它假设在事务执行过程中,很少会有其他事务对同一数据进行修改,因此在读取数据时不对数据进行加锁,而是在更新数据时检查数据是否被其他事务修改过。如果数据没有被修改,就进行更新;如果数据被修改了,就重新读取数据并再次尝试更新,直到更新成功为止。

果酱 の 博客 2592
上一篇: es中ik分词器的安装(win系统下)
下一篇: es中should查询使用注意
若往夕之
博客等级 码龄9年 20粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值