问题:
在MySQL中,根据加锁的维度可以将锁划分为哪些类型呢?
答案:
按读写权限划分:
共享锁(Shared Locks,简称S):在事物要读取一条记录时,需要先获取该记录的S锁,S锁可以在同一时刻 被多个事物同时持有。
排他锁(Exclusive Locks,简称X):在事物要改动一条记录时,需要先获取该记录的X锁。X锁在同一时刻只能被一个事物持有。
意向锁:由数据库自己维护的加锁标识,可以快速的判断表中是否有记录被上锁,避免遍历,提高加锁效率
按加锁粒度划分:
全局锁(Global Locks):对整个数据库实例加锁,影响整个数据库实例的操作。
表锁(Table Locks):对整张表加锁,影响该表的所有操作。
行锁(Row Locks):对表中的某一行或行集合进行锁定,影响该行的所有操作。
行锁分为:
`记录锁`(Record Lock):锁住一行记录。
`间隙锁`(Gap Lock):锁住一个区间(不包括边界)
当我们使用条件范围检索数据并请求共享或排他锁时,InnoDB会给条件范围内但不存在的记录加间隙锁,
如果用相等条件请求一个不存在的记录并加锁时也会触发间隙锁。比如数据库只有1,4两条数据,如果
查找不存在的3,则会导致(1,4)区间锁定。
`临间锁`(Next-key Lock):记录锁和间隙锁的结合(包括边界)
当使用唯一索引时,等值匹配到一条记录那么临间锁就会退化为记录锁,没有匹配到任何记录时,
临间锁就会退化为间隙锁
按实现方式划分:
乐观锁(Optimistic Locking):假定多个事务之间不会发生并发冲突,只在数据更新时才加锁。
悲观锁(Pessimistic Locking):假定多个事务之间会发生并发冲突,在数据访问时就会加锁。
按作用对象划分:
乐观表级锁(Optimistic Table Locks):在执行数据更新操作之前,会先检查数据是否被其他客户端修改过。
悲观表级锁(Pessimistic Table Locks):在执行数据更新操作之前,会直接获取排他锁,阻止其他客户端修改数据。
按持久性划分:
持久锁(Persistent Locks):会在数据更新时加锁,直到事务结束才释放锁。
乐观锁:只在数据更新时加锁,但会在数据更新前检查其他事务是否修改过数据。
按使用场景划分:
行级锁(Row-Level Locks):适用于高并发读写、写操作频繁的场景。
表级锁(Table-Level Locks):适用于读操作较多、并发写较少的场景。
页面锁(Page Locks):适用于读多写少、对数据一致性要求不高的场景。
读锁(Read Locks):适用于大量读取数据的场景。
写锁(Write Locks):适用于对数据一致性要求较高的场景。
注意:本文归作者所有,未经作者允许,不得转载