为什么selectforupdate只在事务中起作用

郭慕荣博客园 郭慕荣博客园     2023-05-03     379

关键词:

在MySQL中SELECT FOR UPDATE建议要在事务中运行,原因是当SELECT FOR UPDATE执行完之后,就释放锁了。其实查询出来的数据接下来还要更新,所以建议必须要在事务中运行,针对spring事务其实就是加注解@Transaction。

图二中显示一直转圈圈,说明上一个图中已经上了锁,第二图的更新必须要在图一结束之后才能进行更新,防止数据出现问题。
for update的使用场景
如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。
比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。
记住一个原则:一锁二判三更新
排他锁的申请前提
没有线程对该结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞。
for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。

 

mysql多列唯一索引在事务中selectforupdate是否行锁

参考技术A代码如下:vipMember=SELECT*FROMvip_memberWHEREuid=1001LIMIT1#查uid为1001的会员ifvipMember.end_at<NOW():UPDATEvip_memberSETstart_at=NOW(),end_at=DATE_ADD(NOW(),INTERVAL1MONTH),active_status=1,updated_at=NOW()WHEREuid=1001else:UPDATEvip_memberSETend_at=DATE_ADD(end_at,INTERVAL1... 查看详情

显式锁selectforupdate用法

两个事务操作:setautocommit=off;A:begin;select*fromstudentswhereid=1forupdate;B:begin;select*fromstudentswhereid=1;显示结果(直接查询,无需获得锁)select*fromstudents;  显示结果select*fromstudentswhereid=2forupdate;显示结果select*f 查看详情

selectforupdate

请问:1、使用select...where...forupdate时,可以同时进行insert操作么?我尝试过好像可以。2、使用select...where...forupdate,只有执行commit后,才能继续使用select...where...forupdate执行?如果同时有两条:select...where...forupdate,那肯定只有... 查看详情

既然没有事务 SELECT FOR UPDATE 是没有意义的,而且事务本身使用锁,那么 SELECT FOR UPDATE 的用例是啥?

】既然没有事务SELECTFORUPDATE是没有意义的,而且事务本身使用锁,那么SELECTFORUPDATE的用例是啥?【英文标题】:SinceSELECTFORUPDATEismeaninglesswithoutatransactionandtransactionsuselocksbyitself,whatistheusecaseofSELECTFORUPDATE?既然没有事务SELECTFORUPDATE... 查看详情

Python3 - '超过锁定等待超时;尝试重新启动事务'并且只在数据库上处理

...Python3-\\\'超过锁定等待超时;尝试重新启动事务\\\'并且只在数据库上处理【英文标题】:Python3-\'Lockwaittimeoutexceeded;tryrestartingtransaction\'andonlyprocessonthedatabasePython3-\'超过锁定等待超时;尝试重新启动事务\'并且只在数据库上处理... 查看详情

为啥我的 history.push 在一个功能中起作用,而在另一个功能中起作用?

...?【英文标题】:Whydoesmyhistory.pushworkinonefunctionbuttheother?为什么我的history.push在一个功能中起作用,而在另一个功能中起作用?【发布时间】:2021-06-1000:53:18【问题描述】:问题:我一直在尝试在我的编辑功能上使用props.history.pu... 查看详情

为啥 L1 正则化在机器学习中起作用

...中起作用【英文标题】:WhyL1regularizationworksinmachineLearning为什么L1正则化在机器学习中起作用【发布时间】:2015-06-3006:04:00【问题描述】:嗯,在机器学习中,防止过拟合的一种方法是添加L2正则化,有人说L1正则化更好,这是为... 查看详情

为啥 const 在 JavaScript 的某些 for 循环中起作用?

...作用?【英文标题】:Whydoesconstworkinsomefor-loopsinJavaScript?为什么const在JavaScript的某些for循环中起作用?【发布时间】:2017-04-2508:48:57【问题描述】:我知道为什么const在for循环中不起作用。我们需要创建一个新范围并将一个值复... 查看详情

mysql读写分离(代码片段)

MySQL读写分离一.原理二.为什么要做读写分离三.实现方式四.搭建MySQL读写分离五.测试读写分离一.原理读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select... 查看详情

selectforupdate行锁

 selectforupdate行锁 2008-05-2615:15:37分类: Oracle Select…ForUpdate语句的语法与select语句相同,只是在select语句的后面加FORUPDATE[NOWAIT]子句。该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这... 查看详情

为啥 /**/ 注释在样式表中起作用,而 // 注释却不起作用?

...【英文标题】:Whydo/**/commentsworkinstylesheetsbut//commentsdon\'t?为什么/**/注释在样式表中起作用,而//注释却不起作用?【发布时间】:2011-01-2913:51:38【问题描述】:这样做有充分的理由吗?蹩脚的问题,但我只是想知道是否有原因。... 查看详情

MySQL事务没有停止for循环的竞争条件

...描述】:我在我的应用程序中使用node-mysql。我尝试实现SELECTFORUPDATE,但我无法让它正常工作。我遇到的问题类似于下面的代码。下面for循环中的第一个事务没有成功阻塞第二个事务。相反,两个事务同时SE 查看详情

为啥 sigmoid 函数在神经网络中起作用?

...中起作用?【英文标题】:WhydosigmoidfunctionsworkinNeuralNets?为什么sigmoid函数在神经网络中起作用?【发布时间】:2012-07-2512:34:59【问题描述】:我刚刚开始为神经网络编程。我目前正在研究反向传播(BP)神经网络的工作原理。虽然... 查看详情

javassm框架面试(代码片段)

...pring顶层容器为BeanFactory。2、AOP:面向切面编程2、Spring的事务?编程式事务管理:编程方式管理事务,极大灵 查看详情

selectforupdate引发死锁分析

本文针对MySQL中在RepeatableRead的隔离级别下使用selectforupdate可能引发的死锁问题进行分析。1.案例业务中需要对各种类型的实体进行编号,例如对于x类实体的编号可能是x201712120001,x201712120002,x201712120003类似于这样。可以观察到... 查看详情

滤波电容在变频电源中起什么作用

滤波电容又可以叫直流电容,是变频电源内部的重要元件之一。在里面有着独特的作用,未来能够让大家更加的了解变频电源。那么今天就来给大家讲讲滤波电容在变频电源中有着什么样的作用呢,变频电源里面的滤波电容的功... 查看详情

Boost union 在 1.67 中不起作用,但在 1.61 中起作用。为啥?

...orksin1.61.Why?Boostunion在1.67中不起作用,但在1.61中起作用。为什么?【发布时间】:2018-07-2215:45:35【问题描述】:我正在尝试弄清楚为什么我的下面的代码在boost1.61中按预期工作,但在boost1.67中却没有。在boost1.61中, 查看详情

spring面试题及答案(代码片段)

...,Spring顶层容器为BeanFactory。②.AOP:面向切面编程Spring的事务?编程式事务管理:编程方式管理事务,极大灵活性,难维护。声明式事务管理: 查看详情