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中。另外两个同理相似。
读锁定
当一个新的客户端请求申请获取读锁定资源的时候,会有如下流程
获取读锁定资源,必须要满足当前资源没有被写锁定,并且写锁定等待队列中没有更高优先级的写锁定的时候,才能获取资源,否则都要进入等待队列。
写锁定
写锁定比较复杂,会经历如下的流程
读请求和写等待队列中的优先级规则
除了READ_HIGH_PRIORITY的读锁定之外,Pendingwrite-lockqueue中的WRITE写锁定能够阻塞所有其他的读锁定;
READ_HIGH_PRIORITY读锁定的请求能够阻塞所有Pendingwrite-lockqueue中的写锁定;
除了WRITE写锁定之外,Pendingwrite-lockqueue中的其他任何写锁定都比读锁定的优先级低。
http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html