美文网首页
Mysql中的锁

Mysql中的锁

作者: 饭团爸爸v5 | 来源:发表于2017-06-23 09:56 被阅读29次

    MySql的锁定机制

    锁的分类

    Mysql中的锁,根据锁住的粒度不同,分为三种类型。

    行级锁定(row-level)

    行级锁定,顾名思义就是对数据的一行进行锁定,这样的锁粒度最小,自然带来了最高的并发处理性能,但是针对行的锁,同样意味着,当并发数量大的时候,会产生大量的锁,这个时候锁的性能开销会占用较多的系统资源,降低整个系统的性能。具体来说就是,当锁粒度小的时候,每次获取和释放锁所需要做的事情就越多,带来的消耗也就越大。此外,过多的锁也更容易造成死锁的问题。

    表级锁定(table-level)

    与行级锁相反,表级锁定是最大粒度的锁定机制,该锁定机制正如他的名字一样,是对整个表的锁定,所以产生的锁是最少的,且由于是对整个表的锁定,所以可以很好的规避死锁问题。不过粒度大带来的问题,自然是因为锁资源在高并发的情况下,竞争激烈,并发程度大打折扣。

    页级锁定 (page-level)

    页级锁定是Mysql中比较独有的一种锁定级别,页级锁定是介于表级锁定和行级锁定之间的,不过很可惜,页级锁定依旧会有死锁问题,

    锁定类型

    mysql的内部实现中更有多达11种的锁定类型,由系统中的一个枚举量(thr_lock_type)定义,各个值的描述如下

    锁定类型 说明
    ignore 当发生锁请求的时候,内部交互使用,在锁定结果和队列中不会有任何信息存储
    unlock 释放锁清秋的交互用锁类型
    read 普通读锁定
    write 普通写锁定
    read_with_shared_locks 在 Innodb引擎中使用到,select ... lockin shared mode会使用该锁
    read_high_priority 高优先级读锁定
    read_no_insert 不允许并发插入(ConcurentInsert)的锁定
    write_allow_write 当由存储引擎自行处理锁定的时候,mysqld允许其他的线程再获取读或者写锁定,因为即使资源冲突,存储引擎自己也会知道怎么来处理
    write_allow_read 这种锁定发生在对表做DDL(ALTERTABLE...)的时候,MySQL可以允许其他线程获取读锁定,因为MySQL是通过重建整个表然后再RENAME而实现的该功能,所在整个过程原表仍然可以提供读服务
    write_concurrent_insert 正在进行ConcurentInsert时候所使用的锁定方式,该锁定进行的时候,除了READ_NO_INSERT之外的其他任何读锁定请求都不会被阻塞
    write_delayed 在使用INSERTDELAYED时候的锁定类型
    write_low_priority 显示声明的低级别锁定方式,通过设置LOW_PRIORITY_UPDAT=1而产生
    write_only 当操作过程中某个锁定异常中断之后系统内部需要进行closetable操作,在这个过程中出现的锁定类型就是write_only

    表级锁定

    MySql的表级锁定分为两种,读和写。在MySql中,用四个队列来维护这两种锁定:两个存放当前正在锁定中的读和写锁定信息,另外两个存放等待中的读写锁定信息。

    • Curent read-lock queue (lock->read)
    • Pending read-lock queue (lock->read_wait)
    • Current write-lock queue (lock->write)
    • Pending write-lock queue (lock->write_wait)
      当前持有读锁的所有线程的相关信息都能在Current read-lock queue 中找到,队列中的信息按照获取到所得时间存放,而正在等待锁定资源的信息则存放在Pending read-lock queue中。另外两个同理相似。

    读锁定

    当一个新的客户端请求申请获取读锁定资源的时候,会有如下流程

    mysql获取读锁资源流程图.png

    获取读锁定资源,必须要满足当前资源没有被写锁定,并且写锁定等待队列中没有更高优先级的写锁定的时候,才能获取资源,否则都要进入等待队列。

    写锁定

    写锁定比较复杂,会经历如下的流程

    mysql获取写锁定流程图.png

    读请求和写等待队列中的优先级规则

    1. 除了READ_HIGH_PRIORITY的读锁定之外,Pendingwrite-lockqueue中的WRITE写锁定能够阻塞所有其他的读锁定;

    2. READ_HIGH_PRIORITY读锁定的请求能够阻塞所有Pendingwrite-lockqueue中的写锁定;

    3. 除了WRITE写锁定之外,Pendingwrite-lockqueue中的其他任何写锁定都比读锁定的优先级低。

    http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html

    相关文章

      网友评论

          本文标题:Mysql中的锁

          本文链接:https://www.haomeiwen.com/subject/fctwkttx.html