MySQL for update 用法解析

这篇具有很好参考价值的文章主要介绍了MySQL for update 用法解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本原理与用法
MySQL在查询语句后面加上 for update ,例如

select * from student where id = 1 for update;

即为手动给读操作加上写锁(或者说给共享锁再加上排它锁)。因为是写锁,如果在此之前有另一个事务对此数据加了写锁,那么当前的查询事务会等待写锁被释放(比如提交或回滚)后再查询。作为解决并发问题的方案之一。

for update nowait:被锁时直接报错而不等待。

for update wait 3:被锁时等待3秒,超过3秒后如果数据还存在写锁,则报错。

一定需要注意的点
for update是根据where的索引情况进行加锁,根据具体情况,可能会产生:行级锁、间隙锁、表级锁。

  • 当查询语句走主键/唯一键索引,且数据全部命中,锁住单行。(即使是范围查询,比如 where id in (1,2,3),如果都存在,也是只锁1,2,3三行)。
  • 当查询语句走主键/唯一键索引,但数据部分命中,或都不命中;或走非唯一索引:用间隙锁,锁住区间行。
  • 当查询语句不走索引,会用间隙锁把整张表锁住(但其实并不是表锁),因此要尽量避免索引失效的场景。

其他补充
间隙锁的范围:
假设数据是这样的

id    name
2    a
6    b
9    c


如果对id=2的数据上间隙锁,则范围是:(-∞,2]、(2,6]

如果对id=6的数据上间隙锁,则范围是:(2,6]、(6,9]

如果对id=9的数据上间隙锁,则范围是:(6,9]、(9,+∞)

另外,开区间的范围是根据主键的排列顺序确定。

锁的介绍:
MyISAM是表级锁,InnoDB默认行级锁,也支持表级锁。

间隙锁只有在InnoDB的RR-可重复读、Serializable级别时才默认支持。

索引失效的常见场景:
联合索引时违背最左匹配原则
范围查询的范围过大,比如>=等范围条件的实际匹配量大、in后面行数较多。
各种语法待试验....面经里写的那些感觉有的不太对,如:文章来源地址https://www.toymoban.com/news/detail-805681.html

  • 有or必全有索引;
  • 复合索引未用左列字段;
  • like以%开头;
  • 需要类型转换;
  • where中索引列有运算;
  • where中索引列使用了函数;
  • 如果mysql觉得全表扫描更快时(数据少);

到了这里,关于MySQL for update 用法解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql——update更新数据的方式

    注:文章参考: MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客 文章浏览阅读2w次,点赞20次,收藏70次。一般在更新时会遇到以下场景:1.全部更新;2.根据条件更新字段中的某部分内容;3.根据不同的条件更新不同的值,以下是几种场景中常用

    2024年04月26日
    浏览(34)
  • 【MYSQL篇】Update语句原理详解

    前面的文章我们已经对MySQL的查询语句的执行流程进行了说明,感兴趣的可以去看看: 【MySQL篇】Select语句原理详解 本篇文章我们来聊聊 MySQL更新语句的执行原理。更新流程和查询流程有什么不同呢? 基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后

    2024年02月10日
    浏览(35)
  • 华纳云:MySQL中如何书写update避免表锁

    要在 MySQL 中编写 UPDATE 语句以避免表锁定,您可以考虑以下几个方面: 1.使用合适的索引: 确保您的表上存在适当的索引,这将有助于提高 UPDATE 查询的性能并减少锁定时间。通过为 WHERE 条件列创建索引,MySQL 可以更快地定位要更新的行,而不需要锁定整个表。 2.减少影响的

    2024年02月16日
    浏览(37)
  • 如何在 mysql 中实现 update与select结合使用?

    1.只修改一个列的写法: 2.修改多个列的写法: 参考: https://blog.csdn.net/weixin_44671994/article/details/87720196

    2024年02月15日
    浏览(41)
  • MySQL中的安全模式(sql_safe_updates)

     安全模式? 在mysql中,如果在update和delete没有加上where条件,数据将会全部修改。不只是初识mysql的开发者会遇到这个问题,工作有一定经验的工程师难免也会忘记写入where条件。为了避免失误造成的数据全部修改和删除,可开启mysql的安全模式。 off表示 没有开启安全模式

    2024年02月04日
    浏览(40)
  • MySQL修炼手册7:数据修改基础:INSERT、UPDATE、DELETE语句详解

    在掌握了MySQL数据库的基础之后,学习如何对数据进行有效的修改是至关重要的。本篇博客旨在提供一个深入的指南,涵盖了数据修改的三大基础操作:插入(INSERT)、更新(UPDATE)、删除(DELETE)。为了更好地理解这些概念,我们首先创建一个示例表“水果表”,然后逐一

    2024年01月17日
    浏览(74)
  • mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file快速解决

    1、可能是/opt/mysql/data/数据目录mysql用户没有权限(修改数据目录的权限) 解决方法 :给予权限,执行 “chown -R mysql.mysql /opt/mysql/data” 然后重新启动mysqld 2、可能进程里已经存在mysql进程 解决方法:用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9 进程号”

    2024年02月08日
    浏览(47)
  • 启动mysql报错:ERROR! The server quit without updating PID file (/database/mysql/mysqld.pid)

    排查思路: ·1.一开始根据报错在网上找的解决方案是这样的,参考(启动mysql服务时一直提示ERROR The server quit without updating PID file)修改完support-files目录下的mysql.server后仍然报这个错 2.然后开始查看错误日志,先重新启动一下mysql tail -f /database/mysql/logs/mysql_5_7_27.err  3.根据报

    2024年02月07日
    浏览(46)
  • 【MySQL系列】ALTER语句详解,以及UPDATE,DELECT,TRUNCATE语句的使用+区别

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 前言: 上一篇博客讲

    2024年02月11日
    浏览(48)
  • 记录mysql ON DUPLICATE KEY UPDATE 时的小坑以及其底层处理逻辑

    表 table 字段有**(id,column1,column2,column3)** id 为主键 column1 , column2 有复合唯一约束 这里插入一个已经存在的数据(只是 column1 , column2 一样, column3 不一样) 报错: Field ‘id’ doesn’t have a default value 按理说 column1 , column2 一样应该走更新操作,但是这里走的插入操作,参考

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包