别废话,各种SQL到底加了什么锁? 糖太宗 • 2022年5月10日 下午10:23 • 技术 • 阅读 24 有朋友留言,问能不能花2分钟讲讲,MySQL的各类SQL语句,究竟加了什么锁? 额,MySQL加的锁,和事务隔离级别相关,又和索引相关,尝试花2分钟讲讲看。 画外音:这2分钟需要的辅助知识,都已经附带了链接,贴心吧! 第一类,普通select加什么锁? (1)在读未提交(Read Uncommitted),读提交(Read Committed, RC),可重复读(Repeated Read, RR)这三种事务隔离级别下,普通select使用快照读(snpashot read),不加锁,并发非常高; (2)在串行化(Serializable)这种事务的隔离级别下,普通select会升级为select ... in share mode; 【快照读】辅助阅读: 《InnoDB,并发如此之高的原因》 【事务隔离级别】辅助阅读: 《InnoDB,巧妙的实现四种事务的隔离级别》 第二类,加锁select加什么锁? 加锁select主要是指: - select ... for update - select ... in share mode (1)如果,在唯一索引(unique index)上使用唯一的查询条件(unique search condition),会使用记录锁(record lock),而不会封锁记录之间的间隔,即不会使用间隙锁(gap lock)与临键锁(next-key lock); 【记录锁,间隙锁,临键锁】辅助阅读: 《InnoDB里的七种锁》 举个栗子,假设有InnoDB表: t(id PK, name); 表中有三条记录: 1, shenjian 2, zhangsan 3, lisi SQL语句: select * from t where id=1 for update; 只会封锁记录,而不会封锁区间。 (2)其他的查询条件和索引条件,InnoDB会封锁被扫描的索引范围,并使用间隙锁与临键锁,避免索引范围区间插入记录; 第三类,update与delete加什么锁? (1)和加锁select类似,如果在唯一索引上使用唯一的查询条件来update/delete,例如: update t set name=xxx where id=1; 也只加记录锁; (2)否则,符合查询条件的索引记录之前,都会加排他临键锁(exclusive next-key lock),来封锁索引记录与之前的区间; (3)尤其需要特殊说明的是,如果update的是聚集索引(clustered index)记录,则对应的普通索引(secondary index)记录也会被隐式加锁,这是由InnoDB索引的实现机制决定的:普通索引存储PK的值,检索普通索引本质上要二次扫描聚集索引。 【索引底层实现】辅助阅读: 《索引,底层是如何实现的?》 【聚集索引与普通索引的实现差异】辅助阅读: 《InnoDB,聚集索引与普通索引有什么不同?》 第四类,insert加什么锁? 同样是写操作,insert和update与delete不同,它会用排它锁封锁被插入的索引记录,而不会封锁记录之前的范围。 同时,会在插入区间加插入意向锁(insert intention lock),但这个并不会真正封锁区间,也不会阻止相同区间的不同KEY插入。 【插入意向锁】辅助阅读: 《InnoDB里的七种锁》 了解不同SQL语句的加锁,对于分析多个事务之间的并发与互斥,以及事务死锁,非常有帮助。 画外音:文章的参考资料为MySQL官网,以及楼主对MySQL的理解,版本基于5.6,欢迎探讨。 希望这2分钟,大家有收获。 架构师之路-分享可落地的架构文章 辅助阅读: 《InnoDB,并发如此之高的原因》 《InnoDB,巧妙的实现四种事务的隔离级别》 《InnoDB里的七种锁》 《索引,底层是如何实现的?》 《InnoDB,聚集索引与普通索引有什么不同?》 谢转。 发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5828 赞 (0) 打赏 微信扫一扫 支付宝扫一扫 糖太宗 0 0 生成海报 缓存与数据库不一致,你遇到过吗? 上一篇 2022年5月10日 下午10:21 InnoDB,快照读,在RR和RC下有何差异?(很多人,以为自己懂了...) 下一篇 2022年5月10日 下午10:24 相关推荐 技术 Log4j CVE-2021-45046 复现 漏洞描述 Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apach... 常山赵子龙 2022年5月27日 22000 渗透测试流程 总结,持续更新 渗透千万条,安全第一条。渗透不授权,亲人泪两行! 白帽子要有自己的原则和底线,即使数据再诱人,也千万不要去拿任何数据! 是要在客户允许的范围内进行测试,白帽子需要有白帽子的底线! 0x00 前言 渗透测试是指渗透人员在不同的位置(比如从内网、从外网等位置)利用各种手段对某个特定网络进行测试,以期发现和挖掘系统中存在的漏洞,然后输出渗透测试报告... 常山赵子龙 技术 2022年5月28日 31000 技术 AutoJS自动过某宝滑块方案 采集淘宝数据时,请求一频繁,就会出现风控跳滑块,这里使用AutoJS自动化控制插件操控手机屏幕自动过滑块。 一、架构 整套方案一共分为三个部分,分别为生成滑块APP、自动过滑块AutoJS脚本、爬虫。 生成滑块APP: 负责生成淘宝滑块; 监听滑块相关请求,滑块验证成功后上报滑块cookie; 自动过滑块AutoJS脚本: 控制安卓手机界面,完成打开APP、... 糖太宗 2022年5月7日 816007 安全设计Checklist(转发) 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向Java Runtime.exec()方法传递不可信、未净化的数据(当参数中包含空格,双引号,以-或者/符号开头表示一个参数开关时,可能会导致参数注入漏洞),建议如果可以禁止JVM执... 常山赵子龙 技术 2022年5月27日 54000 用友致远A6 OA存在sql注入并拿shell 用友致远A6协同系统 /yyoa/common/js/menu/test.jsp 文件 S1 参数SQL注入漏洞 注入点为S1变量,通过探测,发现是mysql数据库 http://xx/yyoa/common/js/menu/test.jsp?doType=101&S1= 于是构造注入语句查询数据库名: http://xx/yyoa/common/j... 常山赵子龙 技术 2022年6月2日 80000 发表回复 您的电子邮箱地址不会被公开。 必填项已用*标注*昵称: *邮箱: 网址: 记住昵称、邮箱和网址,下次评论免输入 提交