MySQL锁分为三种,分别是全局锁,表级锁,行级锁
使用全局锁的方式
mysql
执行该命令后,整个数据库处于只读状态,数据的一切修改操作都会被阻塞
释放全局锁
mysql
全局锁的应用:全库逻辑备份
全局锁的局限:业务阻塞停滞
避免方式:当数据库的引擎支持可重复读的隔离级别,那么可以用事务来进行全库逻辑备份
MySQL表级锁分类
加锁命令
lock tables tablename read;//共享锁
lock tables tablename write;//独占锁
表锁的限制:
**表锁的粒度太大,会影响并发性能,**一般情况下使用粒度更细的行级锁
元数据锁不需要显式的使用,当对数据库表进行操作时,会自动给这个表加上MDL
当执行插入,更新,删除等操作时,需要对表加上意向独占锁,然后对具体的记录加锁,普通的select是不需要加锁的,普通的select通过MVCC完成一致性读,是无锁的
意向共享锁和意向独占锁是表级锁,不会与行级的独占锁和共享锁发生冲突.而且意向锁之间也不会发生冲突,只会和共享表锁,独占表锁发生冲突
意向锁作用:快速判断表里是否有记录被加锁
表里主键通常设置成自增的,插入数据时,可以不再指定主键的值,数据库会自动给主键赋递增的值,就是通过AUTO-INC锁实现
原理:AUTO-INC锁不再是一个事务提交后再释放,而是执行完插入语句后立刻释放
行级锁三类:
间隙锁,只存在可重复读级别,目的是为了解决可重复读下的幻读问题
Next-Key-Lock被称为临键锁,是Record+Gap Lock的组合,锁定一个前开后闭的范围,next-key lock 是包含间隙锁+记录锁的,如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的
一个事务再插入一条记录时,判断插入位置是否被其他事务加了间隙锁,在此期间将生成一个插入意向锁
不同场景,加锁的形式是不相同的
加锁的对象是索引,**基本单位是next-key-lock,**但在一些情况下,使用记录锁或者间隙锁就能避免幻读的情况下,next-key-lock将退化成记录锁或者间隙锁
唯一索引进行索引查询时,分为查询记录存在或者不存在
范围查询会对每一个扫描到的索引加上next-key-lock,遇到下面的情况,会退化成记录锁或间隙锁
一个主索引,一个非唯一索引,那么加锁时,同时对两个索引都加锁,但对主键索引加锁的时候,仅在满足查询条件的记录才会对他们的主键索引加锁