Mysql锁(mysql锁表和解锁语句)
SQL语句查询过程
锁介绍
Mysql引擎对比
锁是计算机协调多个进程或者线程并发访问某一资源的机制
Mysql锁是Mysql在服务层和存储引擎层的并发控制,保证数据并发访问的一致性、有效性
解决锁冲突也是影响数据并发访问性能的一个重要因素
加锁是消耗资源的,锁的操作 包括 获得锁、检测锁是否已释放、释放锁等
Mysql锁粒度:
默认情况下,表级锁和行级锁都是自动获得的,不需要额外的命令,但在有些情况下,用户需要明确的进行锁表或者事务控制,以确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成
数据页是mysql中磁盘和内存交换的基本单位,也是mysql管理存储空间的基本单位, 同一个数据库实例的所有表空间都有相同的页大小;默认情况下,表空间中的页大小都为16KB
事务是指通过将一组相关操作组合为一个要么全部成功要么全部失败的单元;这组操作是一个最小的不可再分的工作单元;单个SQL可以看做是一个事务
基本表锁类型(所有引擎都支持)
在执行 LOCK TABLES 后,只能访问显式加锁的这些表,不能访问未加锁的表
SQL语句类型
MyISAM锁
MyISAM锁类型
MyISAM存储引擎只支持表级锁(基本表锁):
MyISAM总是一次获得SQL语句所需要的全部锁,这也正是MyISAM表不会出现死锁(Deadlock Free)的原因
MyISAM自动获取锁的竞争
MyISAM 表的读操作与写操作之间,以及写操作之间都是串行的,串行是通过加锁来实现的
MyISAM 引擎默认是write Lock优先于read Lock的,也就是说如果一堆写请求和一堆读请求同时要一张表的锁,当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,以致于读请求只能在所有的写请求执行完成后才能获得执行机会
MyISAM 引擎读写并发支持较弱
InnoDB锁
InnoDB锁类型
InnoDB存储引擎支持表级锁、行级锁
InnoDB存储引擎默认使用行级锁
InnoDB行锁机制
InnoDB表级锁类-意向锁(解决表级锁在加锁时的互斥检测)
一个事务要对表A加表级共享锁(表级排它锁),必须保证:
当前没有其他事务持有 A 表的排他锁(共享锁和排它锁)
当前没有其他事务持有 A 表中任意一行的排他锁(共享锁和排它锁)
为了检测是否满足第二个条件,该事务必须去检测表中的每一行是否存在排他锁(共享锁和排它锁),很明显这是一个效率很差的做法;但是有了意向锁之后,只要检测表级意向排他锁(意向共享锁和意向排它锁)就可以了
意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享锁、排他锁之前,InnoDB会先获取该数据行所在数据表的对应意向锁
意向锁不会与行级的共享 / 排他锁互斥,只会与表级共享锁 / 排他锁互斥;表级锁包括 基本表锁、自增锁
DQL和DML操作涉及到行级锁的互斥,由行级锁机制进行检测和处理;互斥则等待锁释放
InnoDB表级锁-自增锁(保证AUTO_INCREMENT列连续)
# 乐观锁与悲观锁
# 死锁检测和恢复
# 锁使用与优化
作者:山水李
链接:https://juejin.cn/post/7036241842735677453
伪原创工具 SEO网站优化 https://www.237it.com/