Mysql中的锁

本文深入探讨了数据库的锁机制,包括全局锁、表级锁(如元数据锁、意向锁)、AUTO-INC锁和行级锁(记录锁、间隙锁和Next-Key Lock)。全局锁在备份时使用,防止数据修改;表级锁中,元数据锁在结构变更时加写锁,意向锁用于行级操作前;行级锁则细化到单条记录,提高并发性能。不同类型的锁在并发控制中起到关键作用,理解并合理使用这些锁可以优化数据库性能。
摘要由CSDN通过智能技术生成

全局锁

加锁后,整个数据库都是只读状态,一般应用在数据库备份的时候,不能用其他事务的修改。但可以通过可重复读隔离级别通过开启事务创建ReadView来解决备份期间修改数据的情况。工具是mysqldump -single-transaction.
InnoDB存储引擎支持但MyiSAM引擎不支持。

表级锁

包括表锁 元数据锁 意向锁 AUTO-INC锁

表锁

对表加锁 共享锁(读锁)和独占锁(写锁)
表锁会限制别的线程读写,直到锁被释放,避免在InnoDB引擎的表使用,因为表锁颗粒度太大,影响并发性能。

元数据锁

对表进行CRUD加MDL读锁
对表进行结构变更操作加的是MDL写锁
阻塞情况:当有线程select时,自动加读锁,如果这时有其他线程要更改表结构(申请写锁)时,就会被阻塞,直到事务提交。同理先修改表结构后crud也会阻塞,但两个线程都是crud不会阻塞。
并且写锁获取优先级高于读锁,一旦出现写锁等待,会阻塞后面所有读锁。

意向锁

在对某些记录加共享锁前先加上意向共享锁
在对某些记录加独占锁前先加上意向独占锁
当执行插入更新删除操作时,先对表加意向独占锁再对记录加独占锁。
普通select不会加行级锁,通过MVCC实现一致性,但可以主动加锁。
表级锁和行级锁不发生冲突。
当加了意向锁,那么在加独占表锁时,先查有没有意向锁,如果有,就不用遍历表里记录了。

AUTO-INC锁

给某个字段声明AUTO-INCREMENT自增属性时,通过AUTO-INC锁实线。
锁在执行完插入语句后释放,一个事务持有AUTO-INC锁时候,别的事务插入会阻塞,在执行大量数据插入时影响插入性能,所以在MySQL5.1.22开始有了轻量级锁实现,轻量级锁在赋值后就释放。

innodb_autoinc_lock_mode

参数为0用AUTO-INC锁
参数为2用轻量级锁
参数为1混着用 能确定插入数量就轻量级 不确定用AUTO-INC锁,但在主从复制的场景是不安全的,虽然是性能最高的方式但因为并发插入的存在,导致自增的值不连续。

行级锁

记录锁 Record Lock

仅仅锁一条记录

间隙锁 Gap Lock

锁定一个范围,但是不包含记录本身

Next-Key Lock

上面两种锁的组合 锁定一个范围 也包括记录本身

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值