MySQL8.0 InnoDB支持 NOWAIT和SKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。 NOWAIT如果请求的行被另一个事务锁定,则会立即返回该语句。SKIP LOCKED从结果集中删除锁定的行。

如果查询数据然后在同一事务中插入或更新相关数据,则常规SELECT 语句不会提供足够的保护。其他事务可以更新或删除您刚查询的相同行。 InnoDB支持两种类型的 锁定读取,提供额外的安全性:

InnoDB 支持执行 SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE 锁定读语句时,带有NOWAIT 和 SKIP LOCKED 选项。如果请求行已经被其他事务锁定, NOWAIT 会立刻返回结果。 SKIP LOCKED 将锁定的行从结果中移除。

官方文档:

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html#innodb-locking-reads-nowait-skip-locked

1、SELECT ... FOR SHARE:

在读取的任何行上设置共享模式锁定。其他会话可以读取行,但在事务提交之前无法修改它们。如果这些行中的任何行已被另一个尚未提交的事务更改,则查询将等待该事务结束,然后使用最新值。

注意:

SELECT ... FOR SHARE是替代SELECT ... LOCK IN SHARE MODE,但 LOCK IN SHARE MODE仍可用于向后兼容。

2、SELECT ... FOR UPDATE:

对于搜索遇到的索引记录,锁定行和任何关联的索引条目,就像您UPDATE为这些行发出 语句一样。阻止其他事务更新这些行,执行SELECT ... FOR SHARE或从某些事务隔离级别读取数据。一致性读取将忽略在读取视图中存在的记录上设置的任何锁定。(旧版本的记录无法锁定;它们是通过在记录的内存副本上应用撤消日志来重建的 。)

注意:

①:提交或回滚事务时,将释放 由设置FOR SHARE和FOR UPDATE查询设置的所有锁。

②:只有在禁用自动提交时(通过使用START TRANSACTION或通过设置 autocommit为0 开始事务处理),才能锁定读取 。

除非在子查询中指定了锁定读取子句,否则外部语句中的锁定读取子句不会锁定嵌套子查询中的表行。例如,以下语句不会锁定表中的行 t2:

SELECT * FROM t1 WHERE c1 = (SELECT c1 FROM t2) FOR UPDATE;

要锁定表中的行,t2请在子查询中添加一个锁定读取子句:

SELECT * FROM t1 WHERE c1 = (SELECT c1 FROM t2 FOR UPDATE) FOR UPDATE;

3、使用NOWAIT和SKIP LOCKED锁定读取并发

如果行被事务锁定 ,则请求相同锁定行的事务SELECT ... FOR UPDATE或SELECT ... FOR SHARE事务必须等到阻塞事务释放行锁。此行为可防止事务更新或删除由其他事务查询以进行更新的行。但是,如果您希望在请求的行被锁定时立即返回查询,或者从结果集中排除锁定的行是可接受的,则无需等待释放行锁定。

为了避免等待其他事务释放行锁, NO WAIT并且SKIP LOCKED 选项可以与 read语句一起使用SELECT ... FOR UPDATE或SELECT ... FOR SHARE锁定。

①:NOWAIT:   使用NOWAIT永不等待获取行锁定的锁定读取。查询立即执行,如果请求的行被锁定,则失败并显示错误。

②:SKIP LOCKED:  使用SKIP LOCKED 永不等待获取行锁定的锁定读取。查询立即执行,从结果集中删除锁定的行。

注意:

①:跳过锁定行的查询会返回数据的不一致视图。SKIP LOCKED因此不适合一般交易工作。但是,当多个会话访问同一个类似队列的表时,它可用于避免锁争用。

②:NO WAIT和SKIP LOCKED 仅适用于行级锁。

以下示例演示NOWAIT 和SKIP LOCKED。会话1启动一个事务,该事务对单个记录执行行锁定。会话2尝试使用该NOWAIT选项对同一记录进行锁定读取 。由于请求的行被会话1锁定,因此锁定读取会立即返回错误。在会话3中,锁定读取SKIP LOCKED返回请求的行,但会话1锁定的行除外。

# Session 1:

mysql> CREATE TABLE t (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;

mysql> INSERT INTO t (i) VALUES(1),(2),(3);

mysql> START TRANSACTION;

mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE;

+---+

| i |

+---+

| 2 |

+---+

# Session 2:

mysql> START TRANSACTION;

mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE NOWAIT;

ERROR 3572 (HY000): Do not wait for lock.

# Session 3:

mysql> START TRANSACTION;

mysql> SELECT * FROM t FOR UPDATE SKIP LOCKED;

+---+

| i |

+---+

| 1 |

| 3 |

+---+

转载于:https://blog.51cto.com/fengfeng688/2147171

MySQL8.0新特性——锁读取相关推荐

  1. MySQL基础篇13【MySQL8.0新特性】

    目录 1. MySQL8新特性概述 1.1 MySQL8.0 新增特性 1.2 MySQL8.0移除的旧特性 新特性1:窗口函数 2.1 使用窗口函数前后对比 2.2 窗口函数分类 2.3 语法结构 ...

  2. MySQL8.0 - 新特性 - 临时表改进

    temptable engine 我们知道UNION, DERIVED TABLE, CTE, 子查询或者distinct order by之类的查询都可能用到临时表来存储中间结果,官方文档中列举了几 ...

  3. MySQL8.0 - 新特性 - Instant Add Column

    MySQL8.0开始对一些DDL操作做了大量的优化,例如原子DDL, 快速DDL(只修改元数据),前者解决了长期以来mysql的一大诟病,后者则提升了dba同学的生活品质 官方文档列出了一些可以快速d ...

  4. Mysql8.0新特性之详细版本

    1. 账户与安全 用户创建与授权 之前:创建用户并授权 1 grant all privileges on *.* to 'myuser'@'%' identified by '3edc #EDC'; ...

  5. mysql8.0 新特性

    1.  账户与安全# 用户创建与授权 之前:创建用户并授权 1 grant all privileges on *.* to 'myuser'@'%' identified by '3edc#EDC' ...

  6. 深入解读MySQL8.0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  7. MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数

    InnoDB在设计lock-free的log system时,除了已有的参数外,还通过宏控制隐藏了一些参数,如果你使用源码编译时,打开cmake选项-DENABLE_EXPERIMENT_SYSVAR ...

  8. MySQL8.0 - 新特性 - 安全及权限相关改进

    MySQL8.0里引入了不少关于权限的改动,从这些改动可以看出来,权限管理更加的规范和遍历了,这和我们之前为rds mysql增加了大量权限管理很类似,想来Oracle也是通过这些改动为其云业务服务的 ...

  9. 深入解读MySQL8.0 新特性 :Crash Safe DDL 1

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

最新文章

  1. Windows核心编程 第23章 结束处理程序
  2. MHA故障切换和在线手工切换原理
  3. Docker系列06—基于容器制作镜像并上传到Docker Registry
  4. Hadoop生态Flume(四)拦截器(Interceptor)介绍与使用(2)
  5. pythonlocust使用方法_使用python的locust库进行性能测试
  6. Spring Boot 10:处理Json数据中的null值
  7. 更新整理本人所有博文中提供的代码与工具(Java,2013.08)
  8. RLE压缩及优化--图片压缩
  9. 【Unity优化】怎样实现Unity编辑器中的协程
  10. Jquery—Jquery异步功能实例
  11. MySQL 用户域权限相关操作
  12. Wendy Shijia 的「 Escher‘s Gallery」可视化作品复现系列文章(三)
  13. MAX232芯片的引脚图和电脑串口的连接电路及RS232引脚定义详细说明
  14. Unity3D中玩家的移动方式,三大类型,八种方式
  15. 2. web前端开发分享-css,js进阶篇
  16. 电脑鼠标右击刷新一直转圈
  17. 文本合成图像栩栩如生,仿佛拥有人类的语言想象力:OpenAI祭出120亿参数魔法模型!...
  18. 美国宣布成立人工智能特别委员会,要确保继续处于领先
  19. 评析VANCL与PPG的营销
  20. Java计算机毕业设计小区物业管理系统

热门文章

  1. MySQL体系结构之物理文件
  2. android源码分析-Zygote
  3. 角色权限(Role)和系统权限(System)的几个澄清实验
  4. 奕新集团--RAC环境后续
  5. 中国机器翻译的世纪回顾
  6. 第9部分 备份与灾难恢复
  7. 刷新aspx页面的六种方法
  8. MySQL Replace INTO的使用
  9. 信号量的实现和应用实验报告_Java高级编程基础:原子信号量操作实现组线程执行管理...
  10. 《Mysql数据库及应用》_MySQL数据库及应用