Mysql中锁的类型有哪些?

Mysql中锁的类型有哪些?

  • 1. 基于锁的属性分类:共享锁、排他锁
  • 2. 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎)、记录锁、间隙锁、临键锁。
  • 3.基于表的状态分类:意向共享锁、意向排他锁。




Mysql中锁的类型有哪些?_第1张图片

1. 基于锁的属性分类:共享锁、排他锁

  • 共享锁

又称为读锁,S锁,当一个事务为数据加上读锁之后,其他事务只能对该时间加读锁,而不能对数据加写锁,知道所有读锁释放之后,其他事务才能对其进行加持写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免重复读取的问题。

  • 排他锁

排他锁又称写锁,简称X锁,当一个事务为数据加上写锁的时候,其他事务不能对其加上任何锁。直到排他锁释放后,才能对数据进行加锁。排他锁的目的是在数据修改的时候,不允许其他人读取和修改,避免了脏数据的问题。

2. 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎)、记录锁、间隙锁、临键锁。

  • 表锁

对整个表进行上锁,当下一个事务访问该表的时候,必须等待上一个事务释放了表锁,才能对其表进行访问。不会会出现死锁。

粒度大、加锁简单、容易冲突

  • 页锁

页锁介于标所和行锁之间,表锁速度快,但是冲突多,行锁冲突少,但是速度慢。一次锁定一组数据,并发一般,会出现死锁。

  • 行锁

锁住的是表中的一行或者多行记录,其他事务访问同一张表的时,只有被锁住的记录不能访问,其他的记录可以正常访问。会出现死锁。

粒度小,加锁比表锁困难,不易冲突,支持更高的并发

  • 记录锁

行锁的一种,和行锁的不同是,只能锁某一行的记录,属于精准命中,命中字段为唯一索引。

粒度更小,加锁更困难,不易冲突,支持更高的并发。

  • 间隙锁

对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这些“间隙”进⾏加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。表记录的一个区间加锁。

  • 临键锁

也是行锁的一种,总结说就是记录所和间隙锁的组合,临键锁会把查询出的记录锁住,并且吧范围查询内的所有间隙也锁住。

3.基于表的状态分类:意向共享锁、意向排他锁。

  • 意向共享锁

当一个事务试图对整个表进行加共享锁之前,首先需要获取这个表的意向共享锁。

  • 意向排他锁

当一个事务试图对整个表进行加排他锁之前,需要先获得这个表的意向排他锁。

当加了这样一个状态,就相当于,告诉其他事务,我已经对整个表进行了共享锁会这我排他锁。避免了对整个索引的每个节点扫描是否加锁,而这个状态就是意向锁。






如有错误欢迎指正

你可能感兴趣的:(数据结构,数据库,sql,mysql,java,数据库)