Java常见技术分享-26-事务安全-锁机制-常见的锁实现

行级锁

比如 Mysql 里的 InnoDB 引擎, 当你执行更新语句where id = 1 时, 会只锁定 id=1 这一行数据。 本质上是对索引记录加上排他锁, 当你用主键id=1查询时, 他会在主键索引树上找到这个记录, 然后给这个索引项加上排他锁,通过在索引记录上设置锁标志 这样其他事务如果要修改同一行 不管什么条件, 只要涉及这个索记录 就会被阻塞。我们知道InnoDB的主键索引是B+树结构, 行锁就是加在B+数的叶子节点上的索引项

间隙锁

间隙锁是行级锁的一种(算是变种), 它锁定的是索引记录之间的间隙, 他会阻止索引记录之间的插入, 重点来了, 不管是修改进来的(比如 锁住的是id 在2~5之间的 , 那么将id = 1 修改成 id = 3 进入 2 ~5 区间 也会被阻止) 或者是 直接被插入进来的 (插入一个id = 4 的),用来防止幻读。

而且 它锁住的 不是一个个大的区间, 而是根据 已经存在的索引记录, 分成一个个小的区间锁。

表级锁

给整个数据库表上了把排他锁, 锁是直接加在表的元数据(描述表的结构的数据, 就像表的说明书)上的, 会加上一个标志。

共享锁 和 排他锁 的使用以及实现

在兼容性上, 针对 一行数据 可以加多个共享锁, 但是只能加一个排他锁 ,同时 排他锁 和 共享锁 不可加在同一行数据。 一行数据 已经加了共享锁, 也不能加排他锁,得等共享锁释放

在实现上, 都差不多, 在索引记录或者表的员数据上设置锁标志。

补充

MyISAM存储引擎 只有 表级锁 , 排他锁和共享锁。 没有行级锁和间隙锁。 并发性能差。 InnoDB引擎啥都有, 这也是为什么InnoDB 现在成功MySQL 的默认引擎之一。

相关推荐
http阿拉丁神猫3 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b4 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi7 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko77 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师7 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.8 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼8 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
gCode Teacher 格码致知9 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工9 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留9 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#