Mysql系列 -锁

1.锁的类型

行级锁

InnoDB实现了如下两种标准的行级锁:

  • 共享锁(S Lock):允许事务对一条行数据进行读取

  • 排他锁(X Lock):允许事务对一条行数据进行删除或更新

如果一个事务T1已经获得了行r的共享锁, 那么另外的事务T2可以立即获得行r的共享锁, 因为读取并没有改变行 r 的数据, 称这种情况为锁兼容 (Lock Compatible)。 但若有其他的事务T3想获得行r的排他锁, 则其必须等待事务T1, T2释放行r上的共享锁——这种情况称为锁不兼容。因为获取排他锁一般是为了改变数据,所以不能同时进行读取或则其他写入操作。

从上表可以发现,X锁与任何锁都不兼容,而S锁仅和S锁兼容。

此外, InnoDB 存储引擎支持多粒度锁定, 这种锁定允许事务在行级上的锁和表级上的锁同时存在。为了支待在不同粒度上进行加锁操作, InnoDB 存储引擎支持 一种额外的锁方式, 称之为意向锁 (Intention Lock)。意向锁是将锁定的对象分为多个层次, 意向锁意味着事务希望在更细粒度上进行加锁。

表级别锁

意向锁即为表级别的锁,分为:意向共享锁(IS Lock)、意向排他锁(IX Lock)
InnoDB存储引擎支持意向锁设计比较简练,其意向锁即为表级别的锁。设计目的主要是为了在事务中揭示下一行将被请求的锁类型。其支持两种意向锁:

  • 意向共享锁(IS Lock):事务想要获得一张表中某几行的共享锁

  • 意向排他锁(IX Lock):事务想要获得一张表中某几行的排他锁

由于InnoDB存储引擎支持的是行级别的锁,因此意向锁不会阻塞除全表扫描以外的任何请求,它们的主要目的是为了表示是否有人请求锁定表中的某一行数据

使用意向锁的优点
如果没有意向锁,当已经有人使用行锁对表中的某一行进行修改时,如果另外一个请求要对全表进行修改,那么就需要对所有的行是否被锁定进行扫描,在这种情况下,效率是非常低的;不过,在引入意向锁之后,当有人使用行锁对表中的某一行进行修改之前,会先为表添加意向互斥锁(IX),再为行记录添加互斥锁(X),在这时如果有人尝试对全表进行修改就不需要判断表中的每一行数据是否被加锁了,只需要通过等待意向互斥锁被释放就可以了。

你可能感兴趣的:(数据库,mysql,数据库)