【数据库】Mysql的锁类型

Mysql中的锁机制主要是为了保证数据的一致性和完整性,在并发的情况下起着至关重要的作用。其中锁的类型主要是分为以下几种:

按照粒度分类

全局锁: 对于整个数据库实例进行枷锁,加锁后整个实例就处于只读的状态。局锁通常用于需要执行一些需要长时间运行或对整个数据库进行变更的操作,如备份、恢复等

**表级锁:**对于整个表进行枷锁,阻止其他食物对该表进行写操作(可能允许读操作,具体取决于锁的类型)。表锁粒度大,开销小,但并发度低。表锁分为表读锁和表写锁。

**行级锁:**对数据库表中的单独一行进行锁定,相比于表级锁,行级锁力度更小,因此在处理高并发事务的时候,能提供更好的并发性能

**页级锁:**在页的力度上进行锁定,锁定的数据资源比行级锁要多,因为一个页中有多个行记录。页锁的开销介于表锁和行锁之间,并发度一般。但需要注意的是,MySQL中只有BDB存储引擎支持页锁

按照模式分类

乐观锁:假设在多个事务同时访问同一条数据时,冲突发生的概率较低,因此在操作数据时不会立即进行锁定,而是在提交数据更改时检查是否有其他事务修改了这条数据。如果没有,就提交更改,否则就回滚事务。乐观锁在MySQL中没有内置的实现,但可以通过编程技巧(如版本号或时间戳)来实现

悲观锁:假设并发操作时会发生冲突,因此在操作期间持有锁来避免冲突。MySQL中的行级锁就是一种悲观锁的实现方式

按照属性分类

**共享锁:**也称为读锁,允许多个事务同时读取同一个资源,但是不可以进行写操作

复制代码

SELECT ... LOCK IN SHARE MODE

**排他锁:**也称为写锁,阻止其他事务对已锁定资源进行读写操作

复制代码

SELECT ... FOR UPDATE

其他锁类型

记录锁: 记录锁是对索引记录的锁,注意,它是针对索引记录,即它只锁定记录这一行数据

间隙锁: 锁定两个值之间的空隙 ,防止其他事务在间隙中插入或删除记录。它的存在可以解决幻读问题,需要注意,间隙锁是在可重复读隔离级别下才会生效

之所以出现幻读的问题,是因为记录之间存在缝隙,用户可以往这些缝隙中插入数据,这就导致了幻读问题。所以我们将之间的间隙锁住,就可以防止幻读的问题的

临键锁: 是间隙锁加记录锁的组合,**既想锁定一行,又想锁定行之间的记录,**其他事务既不能更改锁定的数据,也不能插入,锁的范围是左开右闭

**意向锁:**用于协调事务间的加锁操作,以避免冲突和死锁的发生。例如,事务 A 加锁了 Users 表中的一行数据(行锁),而事务 B 要对整个 Users 表进行加锁(表锁),那么这个时候,如果没有意向锁,那事务 B 就会加锁成功了。而事务 B 如果加锁成功的话,那么它是可以对表中的任意数据行进行操作的,包括事务 A 加锁的那行数据,所以,这个时候就发生了锁冲突。在事务 A 添加行锁的时候,先添加意向锁,而事务 B 在添加表锁的时候,先判断一下意向锁,如果有意向锁了,它就不能加表锁了,这样避免了锁冲突,提升了加锁判断的效率

意向锁主要是分为两种:

  1. 意向共享锁(Intention Shared lock,IS):表示在某个资源上设置共享锁。也就是读锁,用于读取数据的操作,允许多个事务同时持有(共享锁),不互斥。

  2. 意向排他锁(Intention Exclusive lock,IX):表示在某个资源上设置排他锁。也就是写锁,用于修改和更新数据操作,并且同一时间只能由一个事务持有,不能和其他事务共同持有,具有互斥性和排他性

相关推荐
唐青枫3 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马4 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261354 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261354 小时前
Java 打印 Word 文档:从基础打印到高级设置
java
用户35218024547520 小时前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜1 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫1 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq1 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev1 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮1 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js