锁的分类
按照属性
- 共享锁(读锁)
- 排它锁(写锁)
按照粒度
- 表锁
- 页锁
- 行锁(多行)
InnoDB的行锁实现
- 记录锁(Record Locks)
唯一索引,锁定唯一一条记录,必须是唯一索引或者主键索引。 - 间隙锁(Gap Locks)
非唯一索引,它锁定一段范围内的索引记录。
某些SQL语句InnoDB自动加间隙。 - 临键锁(Next-Key Locks)
特殊的间隙锁+记录锁,左开右闭。
每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。
意向锁
InnoDB支持表锁和行锁,为了高效的解决行锁和表锁之间的冲突,InnoDB采用意向锁,来表明某个事务正在锁定一行或者将要锁定一行,由InnoDB自动处理。意向锁之间兼容,与表的共享锁和拍他锁互斥。
MyISAM表锁设计
- 支持并发读,并发写的性能差,在MySQL Server层实现。
- 不会出现死锁,因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。
死锁机制
死锁的条件
- 互斥条件
- 请求与保持条件
- 不可剥夺条件
- 循环等待条件
死锁的解决办法
预防死锁
- 破坏等待与保持
一次性分配,申请的资源要么全部满足要么不满足。
要求每个进程提出新的资源申请前,释放它所占有的资源。 - 破坏不可以剥夺
当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源。 - 破坏循环等待条件
资源有序分配法,系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反
避免死锁
- 银行家算法
检测死锁
- 首先为每个进程和每个资源指定一个唯一的号码。
- 然后建立资源分配表和进程等待表。
解除死锁
- 发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。
- 不能检测到的情况,使用锁等待超时参数 innodb_lock_wait_timeout来解决。
网友评论