全局锁和表锁
-
1.锁的初衷处理并发问题、多用户共享资源,出现并发访问、数据库需要控制资源的访问规则,锁用来实现访问规则的重要数据结构。
-
2.根据加锁的范围,mysql分为全局锁、表
1.全局锁
-
1.全局锁对整个数据库实例加锁。命令:Flush tables with read lock (FTWRL)让整个库处于只读状态
但之后的其他线程的会阻塞:
更新语句(增删改)、数据定义语句(建表、改表)、更新类事务的提交语句 -
2.全局锁的使用场景:全库逻辑备份,库的表都存储为文本,备份过程库完全处于只读状态
-
3.官方自带逻辑工具:mysqldump,当工具使用参数==–single-transaction==,导入数据会启动事务,确保拿到一致性视图,过程可以更新
-
4.single-transaction方法只适用于所有的表使用事务引擎的库
-
5.有些系统,set global readonly=true的值用来做其他逻辑,修改global变量方式影响大
异常处理上执行FTWRL后客户端发生异常断开,自动释放全局锁; readonly后,客户端一直保持readonly状态,长时间处于不可写,风险高
2.表级锁
-
1.mysql表级锁分两种:表锁和元数据锁
-
2.表锁语法:lock tables …read/write.
可以用unlock tables主动释放锁也可以客户端断开自动释放,,此语法会限制其他进程读写也会限定本线程后的操作对象 -
3.元数据锁(meta data lock,MDL):MDL不需要显式使用,访问表的时候自动加上,作用是保证读写正确性,MySQL 5.5版本中引入了MDL
-
4.对表增删改查操作加MDL读锁,对表进行结构变更,MDL写锁
-
5.读锁之间不互斥,多个线程可对一张表增删改查
读写锁之间、写锁之间互斥。两个线程对一个表操作要等另一个执行完毕