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

发布于: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无论操作哪一行数据都会等待直到超时。

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

站长声明

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

标签:

相关文章

  • 老铺黄金等人“折A转港”

    老铺黄金等人“折A转港”

    老铺黄金A股崩盘后,选择转投港股。 11月10日,老铺黄金在香港联交所披露招股说明书。 梦金源今年9月向港股市场发起进攻,之前也曾遭遇过“A”的失败。 11月17日,深交所公告称,星期六福已于11月8日主动撤回上市申请。 黄金珠宝终端消费热情带动黄金珠宝企业业绩稳步上升,不

    06-18

  • 全球首次碳化硅MEMS微推力阵列在轨点火试验成功

    全球首次碳化硅MEMS微推力阵列在轨点火试验成功

    南京理工大学化工学院消息:近日,碳化硅MEMS(微机电系统)微推力阵列芯片在轨点火试验成功与金牛座纳米星运行37天后,从地面收到点火命令成功点火,金牛座纳米星的姿态控制技术在轨道上得到验证。 金牛座纳米卫星由八院所属上海依依斯航天技术有限公司研制。 9月12日11时26

    06-06

  • 【全球财经24小时】2023年9月21日投融资事件汇总及详情

    【全球财经24小时】2023年9月21日投融资事件汇总及详情

    今日全球市场共发生16起投资披露事件,其中境内13起,境外13起。 其中,国内先进制造业4例,医疗健康行业4例,汽车交通运输行业1例,电商零售行业1例,企业服务行业1例,传统制造业2例。 涉外医疗健康行业2例,金融行业1例。 国内事件 1、灵科药业完成C2轮融资,整体C轮融资金

    06-18

  • 相信你的耳朵,盲目测试全球最薄vivo X5Max的Hi-Fi 2.0

    相信你的耳朵,盲目测试全球最薄vivo X5Max的Hi-Fi 2.0

    vivo在年底前发布了年度旗舰——全球最薄vivo,它保持着全球最薄手机的记录。 此外,vivo X5Max还搭载全新手机Hi-Fi 2.0架构,使该手机成为全球音质最好的手机,媲美专业Hi-Fi玩家。 那么,什么是Hi-Fi 2.0?根据vivo提供的信息,Hi-Fi 2.0采用了二次供电+二次放大+专业音频解

    06-17

  • 共享纸巾平台“纸鼠”完成数百万元天使轮融资,白马金服投资

    共享纸巾平台“纸鼠”完成数百万元天使轮融资,白马金服投资

    据投资界2月6日消息,共享纸巾平台“纸鼠”近日宣布,已完成数百万元天使轮融资,投资方为白马金服。    据悉,本轮融资资金将用于共享卫生纸机的升级、研发和市场拓展。   Paper Mouse成立于今年10月,是一个组织共享平台。 公开信息显示,纸鼠目前已预订多台卫生纸机,

    06-18

  • 尊湃通信完成数亿元Pre-A轮融资,致力于提供全系列Wi-Fi芯片及解决方案

    尊湃通信完成数亿元Pre-A轮融资,致力于提供全系列Wi-Fi芯片及解决方案

    投资界(ID:pedaily)5月9日消息,尊湃通信科技(南京)尊湃传播股份有限公司(二)近日宣布完成数亿元Pre-A轮融资。 本轮由小米集团、虎山资本、天极资本、嘉域资本、上海科创海王资本、品智信息等知名金融投资机构投资。 以及产业投资者的构成。 此前,尊湃通讯于5月21日完

    06-18

  • 宜家最酷的未来产品都来自这个神秘的实验室

    宜家最酷的未来产品都来自这个神秘的实验室

    在哥本哈根肉类加工区的中心地带,有无数的画廊、艺术咖啡馆和创意工作室。 其中有一栋由鱼市场改建而成的平米建筑。 利用技术和好奇心来绘制宜家的未来蓝图。 这就是宜家资助的 SPACE10 冒险之旅的起点。 作为宜家的未来生活实验室和产品创意孵化器,SPACE10总是开发一些超级

    06-21

  • 李彦宏内部信宣布李震宇晋升为百度集团高层副总裁

    李彦宏内部信宣布李震宇晋升为百度集团高层副总裁

    百度创始人与CEO李彦宏通过内部信宣布,百度集团副总裁和智能驾驶集团总经理李震宇晋升为集团高层副总裁,并将继续担任全面负责IDG的业务和管理工作,并向集团CEO汇报。

    06-17

  • 艾罗能源正计划在A股IPO,主要产品包括光伏储能系统等

    艾罗能源正计划在A股IPO,主要产品包括光伏储能系统等

    艾罗能源正在筹划A股IPO。 公司长期专注于家用光伏逆变器、家用储能设备等新能源供电设备的研发。 、生产、销售。

    06-18

  • 香港理工大学研发出适用于可穿戴电子装置的高透气超弹导电材料

    香港理工大学研发出适用于可穿戴电子装置的高透气超弹导电材料

    2020年3月24日,香港理工大学(理大)研发出适用于长时间佩戴电子装置的高透气超弹导电材料一段时间。 。 这种创新的导电材料采用涂层或印刷的方法,将液态金属材料添加到静电纺丝制成的弹性纤维网上。 它不仅具有高透气性、弹性、导电性且具有高导电稳定性,可广泛应用于健

    06-06

  • 冯仑:有了这样的制度环境,创新只是“副产品”

    冯仑:有了这样的制度环境,创新只是“副产品”

    近日,万通集团创始人冯仑在WISE超级进化者大会上谈到创新时表示,个人驱动力是一方面,外部的制度环境也很重要。 冯仑表示,必须有一个允许民营企业存在的制度环境,企业才愿意创新。 比如,土地1-2年不开发就被拿走,比如加大健康住房的投入,但登记价格和不创新一样,企业

    06-18

  • 杨迪、麻子、谢广坤都做出了“爆炸性的改变”,这背后是谁?

    杨迪、麻子、谢广坤都做出了“爆炸性的改变”,这背后是谁?

    亚洲换头术的魔力在短视频继续放大。 前一分钟杨迪还自嘲小眼睛,后一分钟成功变身男团酷偶像。 苹果手机的面部识别功能在真正的“苦力”面前不得不被打败。 《狂飙》中的麻子哥变身为五官精致的清秀美男。 无奖猜测。 原本只是想看热闹的网友们大概没有想到,看完一个视频后

    06-18