mysql悲观锁总结和实践

使用场景举例:以MySQL InnoDB为例
商品t_goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品status为1。假设商品的id为1。

一、如果不采用锁,那么操作方法如下:
//1.查询出商品信息
select status from t_goods where id=1;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2 where id=1;

上面这种场景在高并发访问的情况下很可能会出现问题。
前面已经提到,只有当goods status为1时才能对该商品下单,上面第一步操作中,查询出来的商品status为1。但是当我们执行第三步Update操作的时候,有可能出现其他人先一步对商品下单把goods status修改为2了,但是我们并不知道数据已经被修改了,这样就可能造成同一个商品被下单2次,使得数据不一致。所以说这种方式是不安全的。

二、使用悲观锁来实现:
在上面的场景中,商品信息从查询出来到修改,中间有一个处理订单的过程,使用悲观锁的原理就是,当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。

注:要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。

我们可以使用命令设置MySQL为非autocommit模式:
set autocommit=0;

设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:
//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 id=1;
//4.提交事务
commit;/commit work;

注:上面的begin/commit为事务的开始和结束,因为在前一步我们关闭了mysql的autocommit,所以需要手动控制事务的提交,在这里就不细表了。

上面的第一步我们执行了一次查询操作: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
上面我们提到,使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2G的完整形式是什么?

2G:第二代 (2G: Second Generation) 2G is an abbreviation of the "Second-Generation Cellular Network". 2G是“第二代蜂窝网络”的缩写 。 In 1991, 2G cellular networks were commercially introduced on the GSM standard in Finland by Radiolin…

推送证书

2019独角兽企业重金招聘Python工程师标准>>> 推送证书 1 openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes 转换文件上传 2证书有效期 openssl x509 -in xxx.pem -noout -dates —反馈 notBeforeDec 12 07:42:27 2015 GMT notAfterDec 11…

ruby 覆盖率测试_Ruby方法覆盖

ruby 覆盖率测试Ruby中的方法重写 (Method overriding in Ruby) Method overriding simply means that there are two methods defined within the same scope and they both are used for performing different tasks. This feature is provided in an Object-oriented langua…

iOS 之 UITextField

UITextField 之 失去焦点 收起键盘 UITextField 之 手势收起键盘转载于:https://www.cnblogs.com/SimonGao/p/5106681.html

ruby推送示例_Ruby直到示例循环

ruby推送示例直到循环 (The until loop) The until loop is one of the great features of Ruby which makes it different from other programming languages. The support of until loop specifies how much user-friendly language Ruby is? 直到循环是Ruby的重要功能之一&…

Dubbo学习总结(4)——Dubbo基于Zookeeper实现分布式实例

入门实例解析 第一&#xff1a;provider-提供服务和相应的接口 创建DemoService接口 [java] view plaincopyprint? <span style"font-size:18px;">package com.unj.dubbotest.provider; import java.util.List; /** * 定义服务接口&#xff0c;该…

什么是5g全双工模式_5G的完整形式是什么?

什么是5g全双工模式5G&#xff1a;第五代 (5G: Fifth Generation) 5G is an abbreviation of the "Fifth Generation". 5G是“第五代”的缩写 。 It is the fifth-generation wireless technology for digital cellular networks that started broad operation in 2…

Gmap.net 怎么导入离线地图

我使用【http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2882254.html】所提供的方式导出地图数据 但是在【C:\Users\用户名<你的计算机用户名>\AppData\Local\GMap.NET\TileDBv5\en】这个文件夹下看到的Data.gmdb永远是256m 用这个Data.gmdb文件也无法导入 请…

下一个全排列_下一个排列

下一个全排列Problem statement: 问题陈述&#xff1a; Given a permutation print permutation just greater than this. 给定一个排列&#xff0c;打印排列就比这个更大。 Example: 例&#xff1a; Permutation:1 3 2 5 4Output:1 3 4 2 5Solution: 解&#xff1a; What …

[转载]PhotoShop性能优化

现在随着Photoshop版本越来越高功能也越来越强大&#xff0c;而往往强大的功能需要电脑有好的配置运行&#xff0c;比如HDR、图像合成或者3D和视频等类似的功能&#xff0c;还有处理比较大尺寸的图像时&#xff0c;如果电脑配置不够强往往非常卡&#xff0c;这时我们就要好好设…

in-nan(ind)_NaN16 Constant in Julia

in-nan(ind)Julia| NaN16常数 (Julia | NaN16 Constant) NaN16 is a constant of the Float16 type in Julia programming language, it represents "not-a-number" value. NaN16是Julia编程语言中Float16类型的常量&#xff0c;它表示“非数字”值。 Syntax: 句法&…

iOS 架构模式

MVVM指南&#xff08;课程学习&#xff09; iOS 架构模式 iOS 之 依赖注入 Square对iOS App架构的新尝试---Ziggurat 基于彻底解耦合的实验性iOS架构转载于:https://www.cnblogs.com/SimonGao/p/5112299.html

分披萨问题_比萨疯狂问题

分披萨问题Problem statement: 问题陈述&#xff1a; There is a shop which sells pizza of three different sizes- Small, Medium, and Large Pizza. IncludeHelp is crazy for Pizzas. A small Pizza has an area of S unit2, a medium Pizza has an area of M unit2 and …

oracle 10g学习之分组函数

一、 &#xff08;1&#xff09;分组查询语句的顺序 select ... from ... where ... group by ... having ... order by ... 注意&#xff1a; where-->group by分组-->执行组函数-->having筛选->order by 如果select/having语句后面出现了组函数 那么se…

0.1uf与47uf并联_UF是什么形式?

0.1uf与47uf并联UF&#xff1a;超滤 (UF: Ultrafiltration) UF is an abbreviation of Ultrafiltration. It is a kind of membrane filtration which is used in UF water purifiers. Through a hollow fiber threaded semi-permeable membrane, the water is made to proceed…

机器学习相关——协同过滤

在现今的推荐技术和算法中&#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF)&#x…

二维的完整形式是什么?

2D&#xff1a;二维 (2D: Two Dimensional) 2D is an abbreviation of "Two-Dimensional". 2D是“二维”的缩写 。 It is the dimension of any virtual object that has no manifestation of profundity. For example, if a graphic or picture representation of …

InfoQ中文站2015年度优秀社区编辑评选揭晓

\又到了年终岁末&#xff0c;在过去的一年里&#xff0c;InfoQ网站的月独立UV接近130万&#xff0c;月PV突破200万&#xff0c;每周独立访问用户接近30万&#xff0c;网站访问量过万的文章超过60篇。每月活跃的数十位社区编辑为InfoQ的内容生产贡献着力量。正是这点点汇聚的星光…

wfm扩展_WFM的完整形式是什么?

wfm扩展WFM&#xff1a;为我工作 (WFM: Works For Me) WFM is an abbreviation of "Works For Me". WFM是“ Works For Me”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Facebook, Yah…

【设计模式】—— 访问者模式Visitor

对于某个对象或者一组对象&#xff0c;不同的访问者&#xff0c;产生的结果不同&#xff0c;执行操作也不同。此时&#xff0c;就是访问者模式的典型应用了。 应用场景 1 不同的子类&#xff0c;依赖于不同的其他对象 2 需要对一组对象&#xff0c;进行许多不相关的操作&#x…