网站维护的要求包括,ui设计简介,如何做企业网站优化,wordpress添加自定义tag标签1 全局锁
上锁后#xff0c;整个数据库处于只读状态
flush tables with read lock
释放#xff1a;
unlock tables
应用#xff1a;用于全库逻辑备份
缺点#xff1a;如果数据量很大#xff0c;备份会花很多时间#xff0c;只能读数据#xff0c;造成业务停滞
如…1 全局锁
上锁后整个数据库处于只读状态
flush tables with read lock
释放
unlock tables
应用用于全库逻辑备份
缺点如果数据量很大备份会花很多时间只能读数据造成业务停滞
如果引擎支持可重复读的隔离级别备份之前可以先开启事务且由于MVCC的支持备份期间数据库仍然可以更新。
2 表级锁
2.1 表锁
分为共享锁和独占锁会互斥
//表级别的共享锁也就是读锁
lock tables t_student read;//表级别的独占锁也就是写锁
lock tables t_stuent write; 释放
unlock tables
尽量避免使用InnoDB中的表锁因为还有颗粒度更细的行级锁。
2.2 元数据锁 MDL
不需要显示使用MDL对表操作时会自动加MDL。
CRUD操作加MDL读锁对表结构变更加MDL写锁
MDL是为保证用户执行CRUD操作时防止其它线程对表结构做变更。
MDL在事务执行期间一直持有事务提交后释放。
MDL写锁获取优先级高于读锁当写锁等待后续所有CRUD操作都会被阻塞。因此对表结构变更前要先看看数据库中的长事务是否加了MDL读锁如果加了读锁后面所有操作都会被阻塞。可以考虑kill掉这个长事务。
2.3 意向锁
select 可以对记录加共享锁和独占锁加锁之前先对表加意向锁。
//先在表上加上意向共享锁然后对读取的记录加共享锁
select ... lock in share mode;//先表上加上意向独占锁然后对读取的记录加独占锁
select ... for update;
在使用 InnoDB 引擎的表里对某些记录加上「共享锁」之前需要先在表级别加上一个「意向共享锁」在使用 InnoDB 引擎的表里对某些纪录加上「独占锁」之前需要先在表级别加上一个「意向独占锁」
也就是当执行插入、更新、删除操作需要先对表加上「意向独占锁」然后对该记录加独占锁。而普通的 select 是不会加行级锁的普通的 select 语句是利用 MVCC 实现一致性读是无锁的。 意向共享锁和意向独占锁是表级锁不会和行级的共享锁和独占锁发生冲突而且意向锁之间也不会发生冲突只会和共享表锁lock tables ... read和独占表锁lock tables ... write发生冲突。
作用如果没有意向锁加独占表锁时就需要遍历表中所有记录查看是否有记录存在独占锁。而有意向锁后在对记录加独占锁之前会对表加上意向独占锁和独占表锁互斥。
2.4 AUTO-INC锁
主键字段声明AUTO_INCREMENT属性可以不指定主键的值实现自增。这是通过AUTO-INC锁实现的。
AUTO-INC锁是一种特殊的表锁不再是一个事务提交后释放而是执行完插入语句后就会释放。
插入数据会加一个表级AUTO-INC锁主键自增其它插入语句会被阻塞保证字段的值连续递增插入完毕锁释放。
但大量数据插入时会影响性能。因此InnoDB提供了一种轻量级的锁来实现递增。插入数据时给主键字段赋值完毕后锁就释放不需要等整个插入语句执行完毕。
轻量级锁可能会导致主从数据库不一致的问题。参考小林coding.
3 行级锁
InnoDB 引擎是支持行级锁的而 MyISAM 引擎并不支持行级锁。
普通的 select 语句是不会对记录加锁的因为它属于快照读。
如果要在查询时对记录加行锁如下这种查询会加锁的语句称为锁定读。对记录加锁前会对表先加意向锁。
//对读取的记录加共享锁
select ... lock in share mode;//对读取的记录加独占锁
select ... for update;
3.1 Record Lock
记录锁分为S锁和X锁。
共享锁S锁满足读读共享读写互斥。独占锁X锁满足写写互斥、读写互斥。
3.2 Gap Lock
间隙锁只存在于可重复读隔离级别解决幻读现象。
假设表中有一个范围 id 为35间隙锁那么其他事务就无法插入 id 4 这条记录了这样就有效的防止幻读现象的发生。
间隙锁虽然存在 X 型间隙锁和 S 型间隙锁但是并没有什么区别间隙锁之间是兼容的即两个事务可以同时持有包含共同间隙范围的间隙锁并不存在互斥关系因为间隙锁的目的是防止插入幻影记录而提出的。
3.3 Next-Key Lock
临键锁Record Lock Gap Lock,锁定一个范围并锁定记录本身。
假设表中有一个范围 id 为35] 的 next-key lock那么其他事务即不能插入 id 4 记录也不能修改 id 5 这条记录。
next-key lock 是包含间隙锁记录锁的如果一个事务获取了 X 型的 next-key lock那么另外一个事务在获取相同范围的 X 型的 next-key lock 时是会被阻塞的。
3.4 插入意向锁
事务插入一条记录需要判断插入位置是否被其他事务加了间隙锁。有的话就会阻塞直到有间隙锁的事务提交为止在此期间会形成一个插入意向锁表示想插入记录但处于等待状态MySQL 加锁时是先生成锁结构然后设置锁的状态如果锁状态是等待状态并不是意味着事务成功获取到了锁只有当锁状态为正常状态时才代表事务成功获取到了锁。
插入意向锁并不是意向锁是一种特殊的间隙锁锁住的是一个点而不是一个区间。
两个事务不能在同一时间内一个拥有间隙锁一个拥有间隙区间内的插入意向锁。