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 锁:是记录锁和间隙锁的组合,锁定一个范围并包括记录本身。

锁升级

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

锁的粒度

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

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

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

相关推荐
Elastic 中国社区官方博客1 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
红海云2 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba2 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭2 小时前
达梦事物特性及MVCC
linux·运维·数据库
小马同学-3 小时前
MySQL主从复制和读写分离
数据库·mysql
谢亮_vipxieliang3 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
海绵宝宝转agent3 小时前
MySql高频面试八股开源笔记总结
mysql·面试·开源
geovindu4 小时前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠4 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
余槐i4 小时前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务