当前位置:网站首页>关于 MySQL 锁 你知道多少
关于 MySQL 锁 你知道多少
2022-07-18 17:50:00 【daydreamed】
关于 MySQL 锁 你知道多少
1、简介
MySQL 锁 是指 同一时间同一资源只能被一个线程访问。而 锁 正是 数据库系统 区别于 文件系统 的一个关键特性,锁机制 用于管理对共享资源的并发访问。
2、MySQL 锁 的分类
2.1、锁 的类型
- 共享锁(S Lock 即 读锁):对于同一个数据对象,多个事务可以同时对其进行 读操作 而不会相互影响
Select * from table_name where ... lock in share mode;
- 排它锁(X Lock 即 写锁):对于同一个数据对象,若 当前事务 的 写操作 还未完成,其它事务 都不能对其进行 读 / 写 操作
Select * from table_name where ... forupdate;
2.2、锁 的粒度
- 行级锁:只对 当前操作的行 进行加锁(粒度最小)
- 表级锁:对 当前操作的表 进行加锁(粒度最大)
- 页锁:可以 锁定 相邻的一组记录(粒度居中)
2.3、锁 的算法
Intention Lock(意向锁):想要 锁定 某几行记录
Record Lock(记录锁):锁定 单行记录
Gap Lock(间隙锁):锁定一个范围,但不包含 当前操作的记录
Next-Key Lock:锁定一个范围,且包含 当前操作的记录(相当于 Gap Lock + Record Lock)
补充:
InnoDB 支持的意向锁:
- 意向共享锁(IS Lock),事务 想要 获得一张表中某几行的共享锁
- 意向排他锁(IX Lock),事务 想要 获得一张表中某几行的排他锁
2.4、锁 的兼容
若一个事务(A)已经获取了 记录(R)的共享锁,而另一个事务(B)也可以同时获取 记录(R)的共享锁,这种情况称之为 锁兼容;
若另一个事务(C)想获取 记录(R)的排他锁,则它必须等待事务(A)、事务(B)释放 记录(R)上的共享锁,这种情况称之为 锁不兼容。
锁的兼容表:
S | X | IS | IX | |
---|---|---|---|---|
S | 兼容 | 不兼容 | 兼容 | 不兼容 |
X | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
IS | 兼容 | 不兼容 | 兼容 | 兼容 |
IX | 不兼容 | 不兼容 | 兼容 | 兼容 |
记忆小技巧:意向锁与意向锁都兼容,排他锁与其它锁都不兼容,意向排他锁与非意向锁都不兼容,共享锁与(意向)共享锁兼容,意向共享锁只与排他锁不兼容。
2.5、加锁机制
乐观锁(不加锁)
总是假设最好的情况,每次去拿数据时都认为别人不会修改,所以每次都不会上锁。只在更新的时候会判断一下在此期间别人有没有去更新这个数据,然后根据不同结果进行相对应的操作 —— 通过记录这个数据的版本号,每次更新前会先查询版本号,看看版本号是否发生变动,如果没有发生变动,就将版本号更新(加1);如果发生变动,就进行回滚。
悲观锁(加锁)
总是假设最坏的情况,每次去拿数据时都认为别人会修改数据,所以每次都会上锁。
3、MySQL 死锁
当 两个 或 两个以上 的事务 在执行过程中,因 争夺锁资源 而造成了一种相互等待的现象,即死锁。
解决死锁的方法:
超时机制(被动)
给每个事务都设一个 死锁等待时间,当 死锁 发生时,一旦相互等待的时间超过了某一个事务(A)的 死锁等待时间,事务(A)就会进行回滚,而另一个事务(B)就能够解除死锁,继续执行。
wait-for graph(等待图机制)(主动)
利用 MySQL数据库 保存的 锁的信息链表 和 事务等待链表 构造成一张等待图,如果这张图中存在回路(代表存在死锁),MySQL数据库(InnoDB 引擎)将会选择 回滚 造成回路中 undo 量最小的事务,解除回路。
边栏推荐
- List to int type array
- 利用Requests库爬取网页
- 【PHP 系列笔记】01 PHP 环境配置
- 调整数组顺序使奇数位于偶数前面
- Solution: use the @ symbol and report an error: the module "@" or the type declaration of its response cannot be found.
- Adjust the array order so that odd numbers precede even numbers
- Multithreading - thread creation, interrupt, wait, sleep, and get thread references
- 正则表达式从入门到入坑
- IDEA(warning)No artifacts configured
- Apache compilation and installation
猜你喜欢
IDEA(warning)No artifacts configured
ES6-函数参数
【多线程】线程池的七种创建方式,线程池的拒绝策略,线程池看这篇就够了
IDEA方法与方法之间添加显示横线
Multi thread thread communication [thread notification and wake-up wait(), notify() /notifyall()]
Solve the error: 'MySQL' is not a content or external command, nor a runnable program or batch file.
Skywalking应用实战 Agent探针、Rocketbot以及告警
Promise from entry to mastery
每天千万级订单的生成,数据库系统如何设计?订单系统架构如何设计?
Win11玩游戏延迟高的解决办法
随机推荐
MySQL给已存在的主键设置自增
LiveData 还有学习的必要吗?—— Jetpack 系列(2)
(pc+wap) Zhimeng template fiscal and tax bookkeeping website
【ostep】03 虚拟化 CPU - 受限直接执行机制
v-model与.sync修饰符的区别
Face contour image extraction in online conference (I) -- Preface
2022年国内正规的期货平台有哪些啊?方正中期怎么样?安全可靠吗?
Link tracking skywalking nanny level installation tutorial
Internal interception method of incident conflict
100003字,带你解密 双11、618电商大促场景下的系统架构体系
rotate net的pytorch实现
Promise自定义封装
Recursion 2021-10-26
Win10 computer (summary of common functions)
PostgreSQL下的SQL Shell(psql)工具
Transaction mechanism: can redis implement acid attribute?
Solution: after El input sets the show password attribute, Google browser automatically fills in the user name and password entered before.
输入框添加红色*表示必填项
Multithreading - thread creation, interrupt, wait, sleep, and get thread references
Module 2 job