暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql中的共享锁和排他锁

Whoooops 2021-04-15
837

行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突。但是粒度越小,实现的成本也越高。MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁展开的。

    INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。

 共享锁:

    SELECT ... LOCK IN SHARE MODE;

    MySQL会对查询结果集中每行都添加共享锁

     锁申请前提:当前没有线程对该结果集中的任何行使用排他锁,否则申请会阻塞.当前有线程对该结果集中使用共享锁时,其他线程也可以申请共享锁。

     操作限制:

    使用共享锁线程与不使用共享锁线程对锁定记录操作限制表

    线程
    读取操作
    写入操作
    共享锁申请
    排他锁申请
    使用共享锁
    可读
    可写/不可写
    可申请
    可申请
    不使用共享锁

    不可读
    不可写
    可申请

    申请被阻塞
    1. 在使用排他锁之前需要先申请共享锁

    2. mysql在使用insert update和delete时,自动加入排他锁

    3. 一个线程使用共享锁读取数据时,其他数据也可以对锁定数据读取,并且读取的是同一个版本。

    4. 对于写入操作,如果一个线程使用共享锁锁定记录时,在进行写入操作时,需要先申请排他锁。其他线程在对其记录进行写入时,会被阻塞。

    5. 一个线程申请共享锁后,其他线程也可以申请共享锁。但当此线程申请排他锁后,其他线程是不可以申请排他锁的,会被阻塞。


    排他锁:

      SELECT ... FOR UPDATE;

      MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。

      锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。

       操作限制:

      使用排他锁线程与不使用排他锁线程对锁定记录操作限制表

      线程读取操作写入操作
      共享锁申请
      排他锁申请
      使用排他锁
      可读:新版本可写
      可申请可申请:无意义
      不使用排他锁
      可读:旧版本
      不可写
      不可申请不可申请

      1. 使用排他锁线程可以对其锁定记录进行读取,读取的内容为当前事物的最新版本;而对于不使用排他锁的线程,同样是可以进行读取操作,这种特性是一致性非锁定读。即对于同一条记录,数据库记录多个版本,在事物内的更新操作会反映到新版本中,而旧版本会提供给其他线程进行读取操作。

      2. 使用排他锁线程可对其锁定记录进行写入操作;对于不使用排他锁的线程,对锁定记录的写操作是不允许的,请求会阻塞

      3. 使用排他锁进程可对其锁定记录申请共享锁,但是申请共享锁之后,线程并不会释放原先的排他锁,因此该记录对外表现出排他锁的性质;其他线程是不可对已锁定记录申请共享锁,请求会阻塞。

      4. 使用排他锁进程可对其锁定记录申请排他锁(实际上并没有任何意义);而其他进程是不可对锁定记录申请排他锁,申请会阻塞。


      https://blog.csdn.net/tigernorth/article/details/7948539

      原文链接


      文章转载自Whoooops,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论