锁是什么

锁是计算机协调多个进程或线程并发访问某一资源的机制,用于管理对共享资源的并发访问

表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、 InnoDB等存储引擎中

表锁

  • 表读锁( 语法:lock tables 表名 read; )
  • 表写锁( 语法:lock tables 表名 write; )
  • 释放锁(unlock tables)

读锁:

mysql lock wait timeout 配置 mysql dead lock_安全


mysql lock wait timeout 配置 mysql dead lock_java_02


写锁:

mysql lock wait timeout 配置 mysql dead lock_安全_03


mysql lock wait timeout 配置 mysql dead lock_mysql_04

元数据锁

meta data lock , 元数据锁,简写MDL。

MDL锁主要作用是维 护表元数据的数据一致性,在表上有事务时,不能对表结构进行修改。为了避免DML与DDL冲突,保证了读写的正确性

mysql lock wait timeout 配置 mysql dead lock_java_05

意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

  • 意向共享锁(IS): 由语句select … lock in share mode添加 ; 与 表锁共享锁 (read)兼容,与表锁排他锁(write)互斥。
  • 意向排他(IX):由insert、update、delete、select…for update添加 ;与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。

一旦事务提交,意向共享锁、意向排他锁都会自动取消

mysql lock wait timeout 配置 mysql dead lock_mysql_06

mysql lock wait timeout 配置 mysql dead lock_java_07

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在 InnoDB存储引擎中。

InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的 锁。对于行级锁,主要分为以下三类:

行锁

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

mysql lock wait timeout 配置 mysql dead lock_mysql_08


mysql lock wait timeout 配置 mysql dead lock_共享锁_09

  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记 录加锁,此时 就会升级为表锁。

mysql lock wait timeout 配置 mysql dead lock_安全_10


mysql lock wait timeout 配置 mysql dead lock_数据库_11


mysql lock wait timeout 配置 mysql dead lock_mysql_12


mysql lock wait timeout 配置 mysql dead lock_共享锁_13


mysql lock wait timeout 配置 mysql dead lock_mysql_14


mysql lock wait timeout 配置 mysql dead lock_安全_15


mysql lock wait timeout 配置 mysql dead lock_mysql_16

间隙锁&临键锁

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。
  • 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
  • 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会 阻止另一个事务在同一间隙上采用间隙锁。

间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

mysql lock wait timeout 配置 mysql dead lock_数据库_17


mysql lock wait timeout 配置 mysql dead lock_java_18


mysql lock wait timeout 配置 mysql dead lock_java_19


mysql lock wait timeout 配置 mysql dead lock_java_20


mysql lock wait timeout 配置 mysql dead lock_java_21


mysql lock wait timeout 配置 mysql dead lock_安全_22


mysql lock wait timeout 配置 mysql dead lock_安全_23