mysql的锁
锁的作用:在并行多线程运行的情况下,制定的访问数据库的规则。
锁的分类
1、全局锁:锁住整个库,锁定期间只能查询,不能更新
缺点:在业务繁忙的时候,不允许锁库。
全局锁主要用于备份数据库,而不影响对原库的业务访问。
InnoDB引擎,支持在可以更新的情况下,备份。
mysqldump -single-transaction XXX
强烈建议使用InoDB的这种写法。
2、表级锁:对表加锁,这种用的比较少。
(1)表锁:lock tables 只能读,不能其他操作,用的很少。InnoDB支持行锁,表锁粒度太大,所以InoDB中用的很少。
(2)元数据锁MDL锁(默认加的锁):隐式的,从mysql5.5后引入的
。
读锁:MDL锁在增删该查的时候用的是读锁,
写锁:在对数据表字段进行增减,或者新增更新索引的时候用的是写锁,这都是默认的。
读锁跟读锁之间不互斥。而跟写锁有关的都是互斥的。
所以多个线程同时对一张表进行增删改查,但是变更表结构的时候就不能同时进行了。
例如:A事务在查询(未提交),B事务在删除(未提交)C事务在DDL(新增列),这时候A,B事务分别拿着读锁,而C事务拿着写锁,这样A,B事务只有提交完事务,C事务才能往下走,因为读锁跟写锁是互斥的。
可以多个线程同时对一张表进行增删改查,但是变更表结构的时候就不能同时进行了。
血的案例:
对一个小表做DDL,整个表都无法访问了。客户端A正在查询小表t,客户端B在删除t表的一些记录,客户端C在给t表增加新列,后面还有很多客户端操作。假如客户端A\B都是长事务,这样客户端C之后的所有访问都无法完成了,阻塞了。所以要避免长事务