根据属性分为共享锁和排他锁
按照锁的粒度分类可以把数据库锁分为表级锁和行级锁。
Mysql中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单 ,资源消耗也比较少,加锁快,不会出现死锁 。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。
Mysql中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。 InnoDB支持的行级锁,包括如下几种。
Record Lock(记录锁): 对索引项加锁,锁定符合条件的行。其他事务不能修改和删除加锁项;(记录锁就是为某行记录加锁,查询条件中的列必须为唯一索引列或主键列,否则加的锁就会变成临键锁,
查询语句必须为精准匹配 = ,不能为 >、<、like等,否则也会退化成临键锁。 )
Gap Lock(间隙锁): 对索引项之间的“间隙”加锁,锁定记录的范围(对第一条记录前的间隙或最后一条将记录后的间隙加锁),不包含索引项本身。其他事务不能在锁范围内插入数据,这样就防止了别的事务新增幻影行。
(间隙锁基于非唯一索引,它会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据。
为了防止出现 幻读 现象;
间隙的范围:根据检索条件向下寻找最靠近检索条件的记录值A作为左区间,向上寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B] 左开右闭。)
Next-key Lock(临键锁): 锁定索引项本身和索引范围。即Record Lock和Gap Lock的结合。可解决幻读问题。(临键锁可以理解为一种特殊的间隙锁,上面说过了通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。)