选择...更新会锁定表吗?

发布于:2024-10-24 编辑:匿名 来源:网络

大家好,我是苏三,又和大家见面了。前言 前几天,知识星球的朋友问了我一个问题:在MySQL中,事务A中使用select...for update where id=1被锁定,某条数据还没有提交。

这时候如果在事务B中使用select...where id=1来查询那条数据,会不会阻塞等待呢? Select...for update 是 MySQL 中悲观锁的一种用法。一般情况下,一行数据会被锁定,但如果使用不正确,整个表也会被锁定。

其实我之前在实际项目中也尝试过,比如积分兑换礼物的功能。今天我就和大家聊聊select...for update的话题。

希望对您有所帮助。 1、为什么要使用行锁?假设有这样一个业务场景:用户A给你转账人民币,用户B给你转账人民币,你的账户初始化金额为人民币。

在事务1中,将执行以下sql: 代码语言:javascript copy update account set Money=money0 where id=;事务2中会执行如下sql: 代码语言:javascript copy update account set Money=money0 where id= ;这两条SQL执行成功后,你的钱可能会是:,,,这三种情况之一。你之前的想法是用户A和用户B总共给你转账了。

最后,您帐户中的金额应该是正确的。这笔钱是怎么来的?如果事务1正在执行update语句,则事务2也同时执行update语句。

交易1中找到了钱,交易2中也找到了钱。如果交易1先执行更新语句,交易2稍后执行更新语句,则第一次更新将被后续更新覆盖,最终结果为。

如果事务2先执行更新语句,事务1稍后执行更新语句,则第一次更新会被后续更新覆盖,最终结果为。这两种情况都会造成严重的数据问题。

我们需要某种机制来确保事务 1 和事务 2 顺序执行而不是一起执行。这需要锁定。

目前MySQL中最常用的锁有:表锁、行锁和间隙锁。在我们的业务场景中,经常会用到行锁。

事务1执行update语句的过程中,必须先锁定某行数据。此时其他事务必须等待事务1执行完毕并提交事务后才能获取该行的数据。

在MySQL中,行锁功能是通过select...for update语句实现的。但如果在实际工作中使用不当,很容易锁住整个表,严重影响性能。

select...where...for update语句的用法是否正确与where条件中的参数有很大关系。我们来看看以下几种情况。

如果用户表现在有这样一个数据库,数据库版本为:8.0.21,数据库隔离级别为:REPEATABLE-READ。创建的索引如下:id为主键字段,code为唯一索引字段,name为普通索引字段,其他为普通字段。

2.主键 当数据库主键用于where条件时。例如,启动事务1,并在事务中更新id=1的用户的年龄: 代码语言:javascript copy begin; select * from user where id=1 进行更新;更新用户集年龄=22,其中id=1; in where条件id为数据库主键,使用for update关键字添加行锁。

该事务未提交。此时又开启了另一个交易2,id=1的用户年龄也被更新: 代码语言:javascript copy begin;更新用户集年龄=23,其中id=1;犯罪;在执行事务2的sql语句过程中,会等待事务1释放锁。

如果事务1始终不释放行锁,事务2最终会报如下异常: 如果此时启动事务3,更新id=2的用户年龄: 代码语言: javascript copy begin; update user set Age=23 where id=2;commit;执行结果如下: 由于事务3又更新了一行数据,所以执行可以成功。由此可见,使用for update关键字锁定了主键id=1的行中的数据,对其他行中的数据没有影响。

3、唯一索引 当数据库唯一索引用在where条件中时。开启交易1,在交易中用code=更新用户的年龄:代码语言:javascript copy begin; select * from user where code='' 进行更新;更新用户集年龄=22,其中代码='';在where条件代码中是数据库的唯一索引,并使用for update关键字添加行锁。

该事务未提交。此时又启动了另一个事务2,code=的用户年龄也被更新:代码语言:javascript copy begin;更新用户集年龄=23,其中代码='';提交;执行结果与主键相同。

4.普通索引 当数据库普通索引用于where条件时。开启交易1,在交易中更新name=Stephen Chow用户的年龄: 代码语言:javascript copy begin; select * from user where name='Stephen Chow' 进行更新;更新用户集年龄=22,其中名称='Stephen Chow'; where条件中的名称是数据库的普通索引,for update关键字用于添加行锁。

该事务未提交。此时又开启了另一个交易2,name=Stephen Chow的用户年龄也被更新: 代码语言:javascript copy begin;更新用户集年龄=23,其中名称='Stephen Chow';犯罪;执行结果与主键相同。

的。 5、主键范围 当数据库主键范围用于where条件时。

开启交易1,并在交易中更新(1,2)中id为用户的年龄: 代码语言:javascript copy begin; select * from user where id in (1,2) 进行更新;更新用户集年龄=22,其中 id 在 (1,2) 中; where条件中的id是数据库的主键范围,for update关键字用于添加多个行锁。该事务未提交。

此时又启动了另一个事务2,id=1的用户年龄也被更新: 代码语言:javascript copy begin;更新用户集年龄=23,其中id=1;犯罪;执行结果与主键相同。此时又启动了另一个事务2,id=2的用户年龄也被更新: 代码语言:javascript copy begin;更新用户集年龄=23,其中id=2;犯罪;执行结果与主键相同。

6、where条件使用数据库普通字段时,使用普通字段。该字段既不是主键也不是索引。

开启交易1,在交易中更新用户的年龄为age=22: 代码语言:javascript copy begin; select * from user where age=22 进行更新;更新用户集年龄=22,其中年龄=22; where条件中Age是数据库中的公共字段,使用了for update关键字,并加了表锁。此事务中没有提交。

此时又开启了另一个交易2,同时更新了age=22的用户的年龄: 代码语言:javascript copy begin;更新用户集年龄=23,其中年龄=22;犯罪;此时,当事务2执行时,等待事务1释放锁的Block。调整sql条件,将查询条件改为age=23: 代码语言:javascript copy begin;更新用户集年龄=23,其中年龄=23;犯罪;此时,事务3执行时,也会被阻塞等待事务1释放锁。

。也就是说,在for update语句中,使用普通字段作为查询条件时,加的是表锁,而不是行锁。

7、空数据当where条件查询到的数据不存在时会发生什么情况?开启交易1,在交易中更新id=66的用户年龄: 代码语言:javascript copy begin; select * from user where id=66 进行更新;更新用户集年龄=22,其中id=66;该数据不存在。此时又启动了另一个事务2,id=66的用户年龄也被更新: 代码语言:javascript copy begin;更新用户集年龄=23,其中id=66;犯罪;执行结果:执行成功,说明这种情况没有被锁定。

总结:最后总结一下select...for update的加锁情况: 主键字段:加行锁。唯一索引字段:添加行锁。

普通索引字段:加行锁。主键范围:添加多个行锁。

普通字段:加表锁。查询空数据:不加锁。

如果事务1加了行锁但没有释放锁,那么事务2在操作同一行数据时就会一直等待,直到超时。如果事务1加了表锁但没有释放锁,那么事务2无论操作哪一行数据都会等待直到超时。

选择...更新会锁定表吗?

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 镁伽科技黄瑜清:智能自动化给生命科学带来巨大变革

    镁伽科技黄瑜清:智能自动化给生命科学带来巨大变革

    近日,戈壁创投年度投资峰会在线上举行。 戈壁创投邀请LP及被投企业经理参加会议,分享收获,共同努力。 探索趋势,见证未来。 2019年,国际环境复杂严峻,资本市场波动剧烈,加上疫情影响,股权投资面临前所未有的考验。 在“危机”与“机遇”交叉的环境下,戈壁创投继续保持

    06-18

  • 超星星完成数亿元C轮融资,加速释放优质碳化硅衬底产能

    超星星完成数亿元C轮融资,加速释放优质碳化硅衬底产能

    据投资界(ID:pedaily)12月14日消息,江苏超星星半导体股份有限公司超星行(以下简称“超星行”)近日完成数亿元C轮融资。 本轮融资由国际知名投资机构领投,商洛电子、老股东策资本跟投。 云秀资本担任本轮融资独家财务顾问。 超星星成立于今年4月,总部位于江苏南京。 致

    06-18

  • 以36.5亿元卖掉公司后,他流落街头说:我再也不会创业了,我要投资!

    以36.5亿元卖掉公司后,他流落街头说:我再也不会创业了,我要投资!

    沉寂了五个多月后,橙晶创始人乌海因为一篇文章再次回到公众视野。   2天前,吴海参加了摩根士丹利举办的一场“庆祝交易成功”的聚会(橙晶酒店“卖身”给华住酒店)。 “为了庆祝我的公司出售,我的心情可能不太好。 我不知道为什么。 醉了。 ”在《卖了酒店,昨晚,我喝醉

    06-18

  • 13小时破1207亿!砍单的背后是单打的狂欢,潮流已至

    13小时破1207亿!砍单的背后是单打的狂欢,潮流已至

    13:09:49,天猫双11全球狂欢成交额破亿元!地球已经无法阻挡国人“恐怖”的购买力了!虽然本次双11小败家的最终战斗力尚未揭晓,但与去年的亿元数据相比,已经提前了10小时50分11秒。 在同时喊出“痛”和“爽”的同时,国人到底能以怎样的数字打破世人的想象,还有待观察。 很

    06-17

  • 首次发布 - Gluetacs Therapeutics完成A轮融资,加速蛋白降解药物临床转化

    首次发布 - Gluetacs Therapeutics完成A轮融资,加速蛋白降解药物临床转化

    投资界(ID:pedaily)5月31日消息,Gluetacs Therapeutics宣布获得A轮融资,由黄埔生物医药基金领投,其次是广东造币投资、南湾百奥、思南元科。 本轮融资将重点关注博信生物的产品管线GT、GT的临床一期推进及临床前项目开发。 标新生物是上海科技大学免疫化学研究所孵化的一

    06-17

  • 机构也“疯狂”!北京交易所成立以来,累计开展调查762次,谁是“机构调查之王”?

    机构也“疯狂”!北京交易所成立以来,累计开展调查762次,谁是“机构调查之王”?

    作者|徐明辉编辑|六耳源|直达北京交流 年已结束。 回顾今年的经济发展,北京证券交易所是中国资本市场绕不开的话题。 北京交易所作为服务创新型中小企业的主阵地,将成就一批中小企业。 一些企业从被忽视,到如今已颇具规模,如今正站在聚光灯下,接受机构的深入研究。 据

    06-18

  • 菜鸟驿站进军数字化社区生活,正式推出团购、洗衣、回收服务

    菜鸟驿站进军数字化社区生活,正式推出团购、洗衣、回收服务

    进军团购、洗衣、回收……菜鸟驿站刚刚宣布,将从快递服务全面升级为数字化社区生活服务。 据投资界(微信ID:pedaily)消息,今日(6月23日)全球智慧物流峰会上,菜鸟小站宣布升级为数字社区生活小站:通过团购将值得信赖的产品送到你家门口、洗衣、回收等便捷服务。 这意味

    06-17

  • 投资界独家-传闻宝宝树引入互联网巨头加持,估值约150亿元

    投资界独家-传闻宝宝树引入互联网巨头加持,估值约150亿元

    据投资界5月28日消息,有消息称,国内母婴龙头企业宝宝树将引入互联网+来自巨头互联网的新一轮战略投资,最新估值约为1亿元人民币。   援引该消息,人士表示,投资合作计划将于近期公布。 除了战略资本合作、进一步优化股东结构布局外,这个互联网平台也将极大赋能宝宝树在

    06-17

  • iQOO Z3图赏:售价2000元以下的“能手卡”

    iQOO Z3图赏:售价2000元以下的“能手卡”

    不到一个月的时间,iQOO就接连发布了两款新机,有点让人应接不暇。 iQOO Neo 5和iQOO Z3都打“性价比”牌,都有一定的特色,是iQOO品牌主打销量的两条产品线。 ▲新发布的iQOO Z3。 我们在体验iQOO 7时,曾说它是“三双”高手。 它的存在就是带领整个队伍的进攻去攻占城市和领

    06-21

  • 普通人对亚运会的热情尽在快手

    普通人对亚运会的热情尽在快手

    这个中秋国庆假期,没有什么话题能比杭州亚运会更火爆了。 自上月14日亚运会门票开售以来,不少赛事门票都被观众抢购一空。 除了观看赛事本身,看明星在亚运会上讨论比赛、为中国队加油、分享自己的观赛感受也成为一种热潮。 随着29日比赛男子50米蛙泳决赛覃海洋率先冲线,中

    06-18

  • 上海港汽车出口同比增长超过50%

    上海港汽车出口同比增长超过50%

    上海港汽车出口开门红。 海通码头1月份出口各类车辆超过2万辆,同比增长超过50%。 上海作为全国最大的汽车进出口口岸,正在改变过去“出口产品低端、出口市场低端”的局面。 过去60%以上出口到拉美、非洲、中东等地区,到现在欧洲、美国、新西兰、澳大利亚等发达国家占比接近

    06-18

  • 硅谷精英所信奉的“AI宗教”到底是做什么的?

    硅谷精英所信奉的“AI宗教”到底是做什么的?

    作者 |高念编辑|靖宇 滑雪的终点是骨科,科学的终点是……神学? 2019年是当之无愧的“AI+大模型”年。 以ChatGPT为代表的生成式AI的快速进步,甚至让人们认为大型语言模型有资格被称为“世界模型”——人工智能从未像今天这样。 如此接近“神性”。 更难以想象的是,八年前,

    06-17