MySQL作为广泛使用的关系型数据库管理系统,其锁机制尤为复杂和关键
本文将深入探讨MySQL常见语句的加锁行为,并结合事务隔离级别、索引类型以及锁类型进行详细分析
一、锁的基本概念与类型 锁是计算机协调多个进程或线程并发访问某一资源的机制
在MySQL中,锁主要分为以下几类: 1.共享锁(S锁):允许一个事务读取一行数据,同时阻止其他事务获取相同数据集的排他锁
使用`SELECT ... LOCK IN SHARE MODE`语句实现
2.排他锁(X锁):允许获得排他锁的事务更新数据,同时阻止其他事务读取和写入相同数据集
使用`SELECT ... FOR UPDATE`、`INSERT`、`UPDATE`、`DELETE`语句实现
3.意向锁(Intent Lock):表级别的锁,用于协调行锁和表锁之间的冲突
意向共享锁(IS锁)表示事务打算获取行级共享锁,意向排他锁(IX锁)表示事务打算获取行级排他锁
4.间隙锁(Gap Lock):在REPEATABLE READ(RR)隔离级别下使用,防止幻读
它作用于查询范围内不存在的数据,防止其他事务插入新记录
5.Next-Key Lock:行锁和间隙锁的组合,用于RR隔离级别,锁住索引记录及其相邻的间隙,防止幻读
二、事务隔离级别与加锁 MySQL支持四种事务隔离级别,从低到高分别是:READ UNCOMMITTED(未提交读)、READ COMMITTED(提交读)、REPEATABLE READ(可重复读,MySQL默认)和SERIALIZABLE(可串行化)
不同隔离级别下,相同SQL语句的加锁行为可能截然不同
-READ UNCOMMITTED:不使用任何锁,可能导致脏读
-