锁机制
MySQL数据库的锁机制是用来管理 并发访问 数据库的一种机制。通过锁定 数据、表或者表的部分内容 来控制对数据库对象的访问,以确保 一致性和完整性。
MySQL数据库支持多种类型锁,包括 共享\排他锁、意向锁、插入意向锁、自增锁、记录锁、间隙锁、临键锁、悲观锁、乐观锁。
共享\排他锁(S\X锁)
- 共享锁(S)
共享锁用于 读 操作,共享锁之间是兼容的,即多个会话可以同时获取共享锁。
事例:多个数据同时读取同一张表的数据
-- 事务A获取共享锁
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR SHARE;
-- 事务B尝试获取共享锁(可以同时获取)
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR SHARE;
- 排他锁(X)
排他锁用于 写 操作,它与其他锁互斥,即一旦某个会话获取了排他锁,其他会话无法同时获取相同资源的任何锁。
事例:一个事务正在更新数据,其他事务无法写或读
-- 事务A获取排他锁
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE;
-- 事务B尝试获取排他锁(等待事务A释放锁)
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE;
意向锁
意向锁是一种 表级别 的锁,意味着事务在更细的粒度上进行加锁。且IX与IS兼容。
- 意向共享锁(IS)
事务想要获得一张表中某几行的共享锁;
- 意向排他锁(IX)
事务想要获得一张表中某几行的排他锁;
插入意向锁
插入意向锁是间隙锁的一种,专门真对insert操作的。即多个事务在同一个索引、同一个范围区间内插入记录时,如果插入的位置不冲突,则不会阻塞彼此;
自增锁
自增锁是一种特殊的 表级别 锁,专门针对事务插入AUTO-INCREMENT类型的列。即一个事务正在往表中插入记录时,其他事务的插入必须等待,以便第一个事务插入的行得到的主键值是连续的。
记录锁
记录锁是单个行记录上的锁,会阻塞其他事务对其插入、更新、删除;
间隙锁
间隙锁锁定记录的一个间隔,不包含记录本身
例子:
假如数据库已有ID为1、6两条记录,
现在想要在ID in (4,10)之间更新数据的时候,会加上间隙锁,锁住[4,5] [7,10] ,(不包含已有记录ID=6本身)
那么在更新ID=6的记录(只有一条记录)符合条件;
如果不加间隙锁,事务2有可能会在4、10之间插入一条数据,这个时候事务1再去更新,发现在(4,10)这个区间内多出了一条“幻影”数据。
间隙锁就是防止其他事务在间隔中插入数据,以导致“不可重复读”。
临键锁
临键锁是记录锁与间隙锁的组合,即:既包含索引记录,又包含索引区间,主要是为了解决幻读。
悲观锁
MySQL的排他锁也成为悲观锁,该锁对整张表或标号那个的某些行 进行排他性锁定以防止并发修改冲突,一旦数据库加上排他锁,则会使整张表或表中的某些行具备写写、写读排他性的效果。
乐观锁
MySQL也提供了乐观锁,一般有两种途径:建库时添加版本字段,或者更新表数据时按照先查再更新的方式执行。
执行状态解释
是指对数据库中正在执行的操作进行监视和分析,以了解操作的进展和性能情况。
在MySQL中,执行状态解释可以通过执行 SHOW PROCESSLIST 命令或查询 information_schema 系统数据库中的相关表来获得。执行状态解释会提供以下重要信息:
-
ID(连接标识):每一个数据库连接都有一个唯一的标识符
-
用户:正在执行操作的用户名称
-
主机:连接到数据库的主机名/IP地址
-
数据库:正在使用的数据库名称
-
命令:正在执行的操作类型,如select、insert、update、delete等
-
状态:操作的当前状态,如sleep、query、locked等
-
执行时间:操作已经执行的时间
-
SQL语句:正在执行的SQL语句或命令
-
进程列表:当前连接的其他活动查询
通过这些,我们可以了解到 哪些操作正在执行、执行的进度如何以及是否有长时间运行的查询或锁定等问题。对识别潜在的性能问题以及进行相应的优化调整有帮助。
状态情况:
- ”sleep“:空闲连接、客户端暂停、等地锁定
- “query”:执行select查询、执行insert | update | delete 等更新操作、执行存储过程或函数、等待锁定
- “locked”:行级锁定、表级锁定、锁等待超时