锁
锁冲突是针对事务的,另一个事务能不能申请上锁,是和其他事务竞争。
一个事务内部可以加很多锁,互相并不会冲突。
级联回滚调度
多个事务有依赖关系,如果一个事务回滚,那么所有事务也需要回滚。
冲突的数据加锁安排顺序,不冲突的数据不加锁可以直接并发。
二阶段锁
这个是针对一个完整的事务。
即加锁放在上边,解锁放在下边,不能加锁-解锁-加锁这样。
严格两阶段锁
互斥锁保持到提交或者失败才释放,其他事务无法在这个时期读写。
强两阶段锁
互斥锁和共享锁都保持到提交或失败再释放。
锁的升级和降级
共享锁升级为互斥锁。互斥锁可以降级为共享锁。
锁粒度
锁粒度直接影响,管理复杂度和并发程度。
根据结构构建树。
想要在数据库上加锁,需要判断数据库的所有子节点以及父节点都没有加锁。
数据库加锁,其所有的子节点也要加锁。
给文件加锁,其所有行也即加了锁。
为了简化这个考虑情况,加入了意向锁:
意向锁:表现了其子节点的加锁情况
(1)共享意向锁。子节点想加共享锁,就需要先给其所有父节点都加上共享意向锁。
(2)互斥意向锁。子节点想加互斥锁,需要给父节点先加上互斥意向锁。
(3)共享互斥意向锁。既有共享又有互斥锁 ,一个事务中。
子节点加共享锁,
给节点加意向锁判断事务冲突
加意向锁需要从根节点开始加,并且判断,直到目的节点。
意向共享锁不冲突。
互斥意向锁和共享意向锁不冲突,如果两锁加到同一个节点,那么会冲突,但是这个交给了子节点去判断。
互斥锁和意向锁都有冲突。
共享锁和互斥意向锁是冲突的,因为加了共享锁其子节点都加了共享锁,无论是哪个节点加互斥锁都是冲突的。
互斥锁和互斥意向锁也冲突的。
解锁是从当前节点到根节点。
一个互斥锁,一个共享锁,从上往下加锁,在行记录有互斥锁和共享锁冲突。只能等待。
而数据库的意向共享和意向互斥锁不冲突,表的意向共享和意向互斥也不冲突。
死锁
两种方法:预防和处理死锁。
(1)申请到所有资源后再使用。(数据动态变化,不可能实现)
(2)超时失败