锁操作,所起的作用就是防止被锁的对象被并发操作同时修改。
加锁操作就是为特定对象设置一个标志位,然后通过使用锁机制(对象上存在标志位则不能改写,放弃加锁请求或等待锁释放后再进行操作)和释放锁(取消特定对象上被设置的标志位)
锁的本质,是保护共享资源不被兵法修改破坏(原子操作不需要锁)
锁的另外一层含义,是抑制并发。保护共享资源即在抑制并发,抑制并发的另外一部分含义,常用在多个锁同时施加的情况。
全局锁表
- 元数据锁表
- 行级别锁表
mysql server MDL_map m_locks 用于处理DDL之间的并发,处理DDL和DML之间的并发,并发冲突的根源在于元数据的竞争。
innodb提供全局行级锁表(lock_sys_t),用以记录innodb系统运行期间所有行级锁的施加情况,并发冲突的根源在于对表中数据的竞争。
行级锁包括记录锁,谓词锁,谓词页锁,全局级锁表中存放到了不同的Hash表里
封锁系统架构
InnoDB 的写锁三种粒度
enum rw_lock_type_t {
RW S LATCH = 1 , 共享
RW X LATCH = 2 , 排它
RW SX LATCH = 4, 意向排它 阻塞写操作 不阻塞 操作
RW NO LATCH = 8 没有
}
lnnoDB 定义的Mutex
InnoDB 在ibOmutex.h 文件中定义了六种自定义的Mutex :
OSBasicMutex: OS 的Event 定义的Mutex 依赖于具体的OS施加锁只尝一次。
如下面的初始化代码段等。
OSTrackMutex 继承 OSB as icMutex 依赖于OS 施加锁尝函数参数指定的次数(max_spins 参数指定尝试的次数)
TTASFutexMutex 利用OS 的CAS 原子指令实现的施加尝试 利用TAS 实现解锁尝试,用于Linux 的Futex 机制。
【Futex是Fast Userspace rnuTexes的缩写,Linux 2.5.7支持。Futex是用户态与内核态混合的同步机制 同步的进程间通过mmap共享一段内存 futex变量位于这段共享的内存中且操作是原子的。】