【MySQL】MySQL锁(四)其它锁概念

本文详细介绍了MySQL中的自增锁概念,包括其工作原理和配置选项。讨论了死锁的发生机制以及如何通过合理索引和配置避免死锁。同时提到了乐观锁和悲观锁的区别,以及在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL锁(四)其它锁概念

好了,锁相关内容的最后一篇文章了。其实最核心的内容,表锁、行锁、读锁、写锁、间隙锁这些重要的内容我们都已经学习过了,特别是间隙锁,是不是感觉非常复杂。放心,今天的内容就比较轻松了。

自增锁

上回我们在学习 间隙锁 的时候,就顺口提了一下 自增锁 。这个锁又叫 AUTO-INC 锁,它主要是用于带自增字段 AUTO_INCREMENT 属性的,很明显,我们经常定义的自增主键就是走这个锁的。它是一个 表级锁 ,因为要保证多个线程同时插入数据时的增长序列,所以会以锁的方式实现。

什么意思呢?假设当前自增的值是 5 ,这时同时来了 3 个客户端请求要插入数据,那么为了保证插入后的结果是 5、6、7 ,就必须在第一个请求插入前,先获得 5 的锁,另外两个就要等待。当 5 插入完成后,释放自增锁,下一个请求拿到 6 的锁,依次类推。

自增锁有一个相关的配置 innodb_autoinc_lock_mode ,可以指定自增模式。它的设置有这样几个值。

  • 0 传统模式,并发较差

  • 1 连续锁定模式,简单插入(一条一条)时,一次申请多个值,多个事务可以拿锁,并发好一点

  • 2 交错模式,MySQL8 引入,并发性高,但批量插入的时候可能不连续,也就是产生间隙,在主从复制中需要注意要使用行复制

通过 SHOW VARIABLES 也可以查看当前设置的情况。

mysql> show variables like 'innodb_autoinc_lock_mode';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_autoinc_lock_mode | 2     |
+--------------------------+-------+
1 row in set (0.00 sec)

需要设置为哪个值也是根据具体情况,不过我的 MySQL8 默认就是设置的 2 ,这种参数如果没有特别的需求,保持默认即可。

死锁

死锁,什么是死锁?学过 Java 或者其它多线程开发语言的同学对这个词不会陌生。当两个事务同时操作时,互相持有对方所需要的锁时,就会产生死锁。比如下面这个由于互相需要更新对方的数据而导致的死锁。

--
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值