说说你对mysql的锁
锁的话能分为三大类锁,分别是全局锁,表级锁,行级锁
全局锁,就是对整个数据库进行加一个只读锁,所有事务只能进行访问操作不能进行修改操作
表级锁分为表锁,元数据锁,意向锁
表锁有两种分为读锁和写锁,读锁就是当一个事务对表访问时候添加一个读锁,后续事务也只能进行一个读操作
写锁就是一个事务进行独占,加锁的事务可以读,写操作,但是其他事务连读都做不到,写也不行
元数据锁就是在对表进行crud时候会加一个MDl,作用就是在事务进行crud的时候防止其他事务进行修改表结构
意向锁就是当你对单行数据进行操作时,会一个行锁,当其他事务需要去对这整个表加表锁时,需要一个一个去查找行,去看看整个表里是否有行锁,有行锁的话就加不了表锁,是冲突的,但是查找整个表非常的耗时间性能,这个时候意向锁作用就来了,当你对行进行加行锁时候,会对表生成一个意向锁,这个时候当事务需要对整个表加表锁时候发现发现你有意向锁了,代表你已经有了行锁,代表加不了表锁了,省去了查找整个表的步骤
行级锁 分为行锁,间隙锁,临键锁,
行锁,就是当一个语句进行增删改时候会对这一行增加一个排他锁,只有本事务可以读和写,其他事务读写都不可以
当进行查询语句时候不加锁,当查询语句后加了sharemode后就为本行数据加了共享锁,当加了forupdate为本行数据加了排他锁,注意当操作的字段没有索引时,会将行锁,升级到表锁
间隙锁,就是给不存在的记录加锁时,会为那个区间加锁,防止其他事务在这个间隙加入数据,主要是为了防止幻读
临键锁,不仅会锁行数据这一列,还会锁行的间隙,临键锁相当于是行锁和间隙锁的结合体,目前innodb默认的就是行级锁就是临键锁