当前位置: 首页 > news >正文

MySQL锁详解

目录

1 按性能划分

1.1 乐观锁

1.2 悲观锁

2 按数据库操作类型划分

2.1 读锁

2.2 写锁

2.3 意向锁

2.3.1 意向共享锁(IS)

2.3.2 意向排它锁(IX)

3 按数据库操作粒度划分

3.1 表锁

3.2 行锁

3.3 间隙锁

3.4 临键锁


1 性能划分
1.1 乐观锁

使用版本比对实现

update table set ... where version=1

1.2 悲观锁

不管三七二十一操作加锁

2 数据操作类型划分

写锁均属于悲观

2.1 读锁
  • 共享锁SShare)
  • 针对同一份数据多个读操作可以同时进行不会受影响
2.2 写锁
  • 排它锁X(eXclusive)
  • 当前写操作完成阻断其他写锁

2.3 意向锁

意向锁

表明事务稍后表中或者更细粒度对象请求某种

意向锁帮助InnoDB快速检测冲突

2.3.1 意向共享锁(IS)
  • 表示事务某些设置共享

  • 事务想要给表中某些加S锁时
  • 会首先表级别获取一个IS锁
  • IS并不直接阻止其他事务访问该表数据以及表级别S
  • 阻止其他事务获取的X

2.3.2 意向排它锁(IX)
  • 表示事务某些设置排它锁

  • 事务想要修改(更新,删除,插入)表中某些
  • 会首先表级别获取一个IX锁
  • IX并不直接阻止其他事务访问该表数据
  • 阻止其他事务获取S或者X
3 按数据库操作粒度划分
3.1 表锁
  • 每次操作锁住整张
  • 开销加锁
  • 粒度发生冲突概率
  • 并发最低

  • 写锁
lock table aaa write;

lock table bbb read;

  • 查看表锁
SHOW OPEN TABLES WHERE In_use > 0;

  • 解除当前session所有表锁
unlock tables;

注意

  • 同一session多次执行lock table命令先释放前一次再进行加锁
  • 阻塞操作不会阻塞操作
  • 操作阻塞
  • session加了之后只能操作

  • MyISAMInnoDB均支持表锁
  • MyISAM执行select会自动给
  • InnoDB设置隔离级别串行select前也会自动给
  • InnoDB设置隔离级别其他select所查询数据

3.2 行锁
  • 每次操作锁住一行数据
  • 开销大加锁慢
  • 锁粒度最小发生冲突概率最低
  • 并发
  • InnoDB支持

  • S

  • 查看S

  • update加X锁

  • 查看X

  • insert加X锁

  • 查看X此时仅有意向排他

  • 另外一个sessionid5S

  • 然后再次查看X锁才会显示出来有点奇怪,应该insert之后就有的)

  • delete加X锁

  • 查看X

  • select加X锁

  • 查看X

  • 查看行锁争夺情况
show status like 'innodb_row_lock%';

字段

含义

Innodb_row_lock_current_waits

当前等待锁的数量

Innodb_row_lock_time

系统启动到现在锁定时间长度

Innodb_row_lock_time_avg

每次等待锁花的平均时间

Innodb_row_lock_time_max

从系统启动现在等待最长一次时间

Innodb_row_lock_waits

系统启动现在总共等待次数

  • 分析行锁系统表
performance_schema.data_locks
performance_schema.data_lock_waits

  • 查看死锁以及等待详细信息
show engine innodb status\G

3.3 间隙锁
  • 隔离级别重复一个范围
  • 可以解决幻读问题

  • 间隙分析

操作

事务A

事务B

设置隔离级别开启事务

事务AX

此时查询范围 3 < id < 18

但是加锁范围 3~20

事务B尝试插入id4数据

由于3~20间隙存在超时报错

事务B插入id19数据

由于3~20间隙存在超时报错

事务B插入id为22的数据

22间隙锁插入成功

  • 查看间隙

3.4 临键锁
  • 间隙行锁组合
  • mysql间隙发现间隙范围存在数据则会每行数据加上一个行锁

http://www.xdnf.cn/news/17659.html

相关文章:

  • 2025年大数据实训室建设及大数据实训平台解决方案
  • Vmware esxi 查看硬盘健康状况
  • 【深度学习】张量计算:爱因斯坦求和约定|tensor系列03
  • 如何才能学会代数几何,代数几何的前置学科是什么
  • 使用Trae CN分析项目架构
  • 理解.NET Core中的配置Configuration
  • 时序逻辑电路——序列检测器
  • 【Contiki】Contiki process概述
  • 基于slimBOXtv 9.16 V2-晶晨S905L3A/ S905L3AB-Mod ATV-Android9.0-线刷通刷固件包
  • 铁氧体和纳米晶:车载定制电感的材料选择
  • 什么是Python单例模式
  • 解决方德桌面操作系统V5.0-G23没ll命令的问题
  • 以太网交换机介绍
  • Docker compose使用、容器迁移
  • 3个实用的脚本
  • Linux系统编程---多进程
  • Python3.14都有什么重要新特性
  • 聚合直播-Simple Live-v1.7.7-全网直播平台能在一个软件上看完
  • java+postgresql+swagger-多表关联insert操作(九)
  • C++ 常用的智能指针
  • 使用Docker搭建开源Email服务器
  • 高防IP如何针对DDoS攻击特点起防护作用
  • 小刚说C语言刷题——1033 判断奇偶数
  • 《GPT-4.1深度解析:AI进化新标杆,如何重塑行业未来?》
  • Spring数据访问全解析:ORM整合与JDBC高效实践
  • 【Mysql】mysql数据库占用空间查询
  • 基础编程题目集 6-2 多项式求值
  • VUE简介
  • 蓝桥杯12. 日期问题
  • 全面解析IPv6:从理论到实践(以H3C配置为例)