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 的默认引擎之一。

相关推荐
SimonKing31 分钟前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean38 分钟前
Jackson View Extension Spring Boot Starter
java·后端
Seven972 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55111 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河11 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程14 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅16 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者17 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺17 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端