InnoDB锁
锁是数据库系统区别于文件系统的一个关键特性, 锁机制用于**管理对共享资源的并发访问.**InnoDB存储引擎会在行级别上对表数据上锁, 也会在数据库其他地方使用锁, 从而允许对多种不同资源提供并发访问. 例如, LRU列表, 删除, 添加, 移动LRU列表中的元素, 为了保证一致性, 必须有锁的介入. 数据库系统使用锁是为了支持对共享资源进行并发访问, 提供数据的完整性和一致性
1.lock与latch
- latch一般称为闩锁(轻量级的锁), 因为其要求锁定的时间非常短. InnoDB中, latch又可以分为mutex(互斥量)和rwlock(读写锁). 其目的是用来保证并发线程操作临界资源的正确性, 并且通常没有死锁检测的机制
- lock的对象是事务, 用来锁定的是数据库中的对象, 如 表, 页, 行. 并且一般lock的对象仅在事务 commit或rollback后进行释放
lock | latch | |
---|---|---|
对象 | 事务 | 线程 |
保护 | 数据库内容 | 内存数据结构 |
持续时间 | 整个事务过程 | 临界资源 |
模式 | 行锁, 表锁, 意向锁 | 读写锁, 互斥锁 |
死锁 | 通过wait-for graph, time out等机制进行死锁检测和处理 | 无私所检测与处理,仅通过应用程序加锁的顺序(lock leveling)保证无死锁的情况发生 |
存在于 | Lock Manager的哈希表中 | 每个数据结构的对象中 |
2.InnoDB中的锁
1>锁的类型
InnoDB实现了如下两种标准的行级锁
- 共享锁(S Lock) : 允许事务读一行
- 排他锁(X Lock) : 允许事务删除或更新一行数据
X | S | |
---|---|---|
X | 不兼容 | 不兼容 |
S | 不兼容 | 兼容 |
X锁与任何 的锁都不兼容, , 仅S锁和S锁兼容, S锁和X锁都是行锁, 兼容是指对同一记录(row)锁的兼容性情况
此外, InnoDB支持多粒度锁定, 这种锁定允许事务在行级上的锁和标记上的锁同时存在. 为了支持在不同粒度 上进行加锁操作, InnoDB支持一种额外的锁方式, 称为意向锁. 意向锁是将锁定的对象分为 多个层次, 意向锁意味着事务希望在更细粒度上进行加锁
若将上锁的对象看成一棵树, 那么对最下层的对象上锁, 也就是对最细粒度的对象进行上锁, 那么首先需要对粗粒度的对象上锁.如图, 如果需要给页上的记录r进行上X锁, 那么分别需要对数据库A, 表, 页上意向锁IX, 最后对记录r上X锁. 若其中任何一个部分导致等待, 那么该操作需要等待粗粒度的完成
InnoDB支持意向锁的设计比较简单, 其意向锁即为表级别的锁. 设计目的主要是为了在下一个事务中揭示下一行 将被请求的锁类型. 其中支持两种意向锁 :
- 意向共享锁(IS Lock), 事务想要获得一张表中某几行的共享锁
- 意向排他锁(IX Lock), 事务想要获得一张表中某几行的排他锁
由于InnoDB存储