MySQL的锁

MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制,主要分为以下几种类型:

1.行级锁
  • 行级锁是MySQL中锁定粒度最细的锁,只针对当前操作的行进行加锁。
  • 优点在于开销小、并发性能高,适用于InnoDB存储引擎。
  • InnoDB支持两种行级锁:共享锁(S锁,也叫读锁),多个事务可以同时获得同一数据行的共享锁;排他锁(X锁,也叫写锁),一个事务对某一行加上了排他锁后,其他事务不能再对该行加任何类型的锁。
2.表级锁
  • 表级锁是对整个数据表进行加锁,MyISAM存储引擎默认使用的就是表级锁。
  • 表级锁的开销小,加锁快,但锁定粒度大,发生锁冲突的概率相对较大,并发性能较差。
  • 包括读锁(共享锁)和写锁(排他锁),在MyISAM中,一个表只能有一个写锁,但可以有多个读锁。
3.乐观锁与悲观锁

在 MySQL 中,乐观锁和悲观锁是两种处理并发访问的不同策略。

乐观锁(Optimistic Locking)

乐观锁假设在大多数情况下,数据不会发生冲突,因此在读取数据时不会加锁。当要更新数据时,它会检查在读取数据后是否有其他事务对数据进行了修改。通常,乐观锁会使用版本号或时间戳等机制来检查数据是否被修改。

悲观锁(Pessimistic Locking)

悲观锁则是假设数据在大多数情况下会发生冲突,因此在读取数据时会加锁,直到事务完成后才会释放锁。悲观锁适用于并发写入较多的场景,但是会增加系统开销并可能降低并发性能。

说明:

  1. InnoDB的行级锁:InnoDB存储引擎支持行级锁,这是为了支持高并发的读写操作。行级锁可以最大限度地减少锁竞争,提高并发性能。
  2. 死锁:当两个或多个事务相互等待对方释放资源时,就会发生死锁。InnoDB有一个死锁检测机制,当检测到死锁时,它会主动回滚其中一个事务,从而解决死锁。
  3. 记录锁:锁定单个行记录。
  4. 间隙锁:锁定一个范围,但不包括记录本身。这主要用于防止幻读。
  5. Next-Key 锁:是记录锁和间隙锁的组合,锁定一个范围并包括记录本身。

锁升级

在某些情况下,为了避免死锁或提高性能,数据库可能会决定升级锁,例如从行级锁升级到表级锁。

锁的粒度

锁的粒度指的是锁所覆盖的数据范围。例如,表级锁的粒度是整个表,而行级锁的粒度是表中的单个行。

在实际开发中,为了保证数据一致性,我们需要根据业务场景合理选择合适的锁策略,避免长时间持有不必要的锁,减少锁等待和死锁的发生。例如,在进行更新或者删除操作时,尽量通过主键或唯一索引进行条件查询并获取行锁,以提高并发处理能力。

另外,选择乐观锁还是悲观锁取决于数据访问的模式、应用的并发情况以及对性能的要求。通常情况下,如果并发冲突较少,乐观锁是一个较好的选择,因为它不会阻塞其他事务;而如果并发冲突较多,悲观锁可能更适合,因为它可以确保数据的一致性。

相关推荐
Rookie也要加油23 分钟前
01_SQLite
数据库·sqlite
liuxin3344556627 分钟前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。1 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec1 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa1 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke2 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录2 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.3 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
程序猿小D3 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa