Mysql中的锁

2017-06-23  本文已影响29人  饭团爸爸v5

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中,用四个队列来维护这两种锁定:两个存放当前正在锁定中的读和写锁定信息,另外两个存放等待中的读写锁定信息。

读锁定

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

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

上一篇下一篇

猜你喜欢

热点阅读