• MySQL 8.0新特性 -- nowait以及skip locked


    如果某行记录被事务锁住了,select ... for update、或select ... for share事务对相同的行加锁的时候必须等待,直到产生阻塞的事务释放锁。

    为了避免等待事务释放锁定的行,nowait和skip locked选项可以被用于select ... for update或select ... for share语句:
    ·nowait:使用了nowait选项的锁定读操作,会立即执行,如果读的记录被锁定了就会报错
    ·skip locked:使用了skip locked选项的锁定读操作,会立即执行,如果读的记录被锁定了就会从结果集移除该记录。返回的数据是非一致性的。因此,不适用于常规的事务。

    nowait和skip locked只适用于行级锁。

    nowait和skip locked对于基于语句的复制是不安全的。

    # 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 |
    +---+
    

      

  • 相关阅读:
    @RequestParam和@PathVariable用法小结
    Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法
    allator 对springBoot进行加密
    commons-lang3相关类实例
    JSP自定义标签
    Netty的简单Demo
    Spring-AOP为类增加新的功能
    深入理解abstract class和interface
    linux的基本操作
    GitHub从小白到熟悉<二>
  • 原文地址:https://www.cnblogs.com/abclife/p/12619352.html
Copyright © 2020-2023  润新知