02 锁

Wu Jun 2020-02-13 01:14:36
07 数据库 > 01 MySQL

1 锁粒度

锁策略:就是在锁的开销和数据的安全性之间寻求平衡。

MySQL 中提供了两种锁粒度:

2 锁类型

2.1 读写锁

2.2 意向锁

意向锁(IX/IS)都是表锁,用来表示一个事务想要在表中的某个数据行上加 X 锁或 S 锁。

通过引入意向锁,事务 T 想要对表 A 加 X 锁,只需要先检测是否有其它事务对表 A 加了 X/IX/S/IS 锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务 T 加 X 锁失败。

3 锁协议

3.1 三级封锁协议

3.2 两段锁协议

加锁和解锁分为两个阶段进行。

事务遵循两段锁协议是保证可串行化调度的充分条件。例如以下操作满足两段锁协议,它是可串行化调度。

lock-x(A)...lock-s(B)...lock-s(C)...unlock(A)...unlock(C)...unlock(B)

但不是必要条件,例如以下操作不满足两段锁协议,但是它还是可串行化调度。

lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(C)...unlock(C)

3.3 隐式和显式锁定

4 死锁

死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。大多数情况下只需要重新执行因死锁回滚的事务即可。

5 间隙锁

间隙锁(Next-Key Locks) 是 MySQL 的 InnoDB 存储引擎的一种锁实现。

在可重复读隔离级别下,使用 MVCC + Next-Key Locks 可以解决幻读问题。