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