MYSQL之锁

本文详细阐述了MySQL中的全局锁、表锁(包括共享和独占)、元数据锁、意向锁以及行级锁(如记录锁、间隙锁和next-keylock)的使用、应用场景和优缺点,特别强调了InnoDB和MyISAM引擎的区别,以及如何通过事务隔离来优化备份数据库过程。

全局锁

全局锁怎么用?

  • 执行 flush tables with read lock 后,整个表就会处于只读状态

  • 这时其他线程执行以下操作,都会被阻塞:

    • 对数据的增删改操作,比如 insert、delete、update等语句;

    • 对表结构的更改操作,比如 alter table、drop table 等语句。

  • 释放全局锁 unlock tables 或者 会话断了自动释放锁

全局锁应用场景是什么?

  • 主要用于 全库逻辑备份 ,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

加全局锁又会带来什么缺点呢?

  • 数据量过大,导致数据库一直只读,导致 业务停滞

既然备份数据库数据的时候,使用全局锁会影响业务,那有什么其他方式可以避免?

  • 如果数据库的引擎支持的事务支持可重复读的隔离级别,会在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作

  • 因为在可重复读的隔离级别下,即使其他事务更新了表的数据,也不会影响备份数据库时的 Read View,这就是事务四大特性中的隔离性,这样备份期间备份的数据一直是在开启事务时的数据。

  • 备份数据库的工具是 mysqldump,在使用 mysqldump 时加上 –single-transaction 参数的时候,就会在备份数据库之前先开启事务。这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。

  • InnoDB 存储引擎默认的事务隔离级别正是可重复读,因此可以采用这种方式来备份数据库。

  • 但是,对于 MyISAM 这种不支持事务的引擎,在备份数据库时就要使用全局锁的方法

表级锁

  • 表锁
  • 元数据锁
  • 意向锁
  • AUTO-INC 锁

表锁

添加表锁:

//表级别的共享锁,也就是读锁;
lock tables t_student read;

//表级别的独占锁,也就是写锁;
lock tables t_stuent write;

 释放表锁:

unlock tables

或者 等会话结束

不过尽量不要在InnoDB引擎中使用表锁,因为表锁的粒度太大,会影响并发性能。InnoDB厉害的地方就是使用了粒度更细的行级锁。

元数据锁(MDL)

不需要显示加锁,对数据库进行操作时,会自动加元数据锁:

  • 对一张表进行 CRUD 操作时,加的是 MDL 读锁

  • 对一张表做结构变更操作的时候,加的是 MDL 写锁

MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。

MDL 不需要显示调用,那它是在什么时候释放的?

  • MDL

意向锁

意向锁是当你添加表锁时,会添加意向锁标识,当其他qt

AUTO-INC 锁

是自增字段添加的锁,当一个字段插入进行自增时,会添加这个锁,当插入sql执行完后,才会释放锁。

行级锁

  • 记录锁(Record-Lock)
  • 间隙锁(Gap-Lock)
  • next-key lock(Record-Lock+Gap-Lock)

记录锁(Record-Lock)

select....for update(独占锁,写锁)

select...share in modle(共享锁,读锁)

除此之外,updatedelete 也会加行级锁,且锁的类型都是独占锁(X类型)

那insert啥时候加锁?

insert正常是不会加锁的,他有一个 trx_id 隐式锁(如果这个锁不发生冲突,就不加锁;如果冲突,就变为显式锁)。

间隙锁(Gap-Lock)

为了防止幻读的。

       间隙锁存在 X 型间隙锁和 S 型间隙锁,但是并没有什么区别,间隙锁之间是兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系,因为间隙锁的目的是防止插入幻影记录而提出的

next-key lock(Record-Lock+Gap-Lock)

Next-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。

next-key lock 是包含间隙锁+记录锁的,如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值