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

锁升级

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

锁的粒度

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

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

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

相关推荐
海浪仙人掌4 分钟前
应收账款分析如何操作?应收账款分析有哪些注意事项?
数据库·人工智能
Elastic 中国社区官方博客8 分钟前
在 Elasticsearch 中回填时间序列数据:通过批量 API 加载数月的历史指标数据
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
Horn Still Sounds12 分钟前
Linux网络并发服务器模型与SQLite数据库学习笔记
linux·服务器·数据库
昵称画41 分钟前
POC验证怎么设计用例?不走过程的实操要点
大数据·数据库·人工智能·低代码·excel
TDengine (老段)1 小时前
TDengine Catalog 与元数据缓存
大数据·数据库·物联网·缓存·时序数据库·tdengine
CarIise1 小时前
MySQL数据库表关系与多表查询:从表间关系设计到JOIN联表查询
数据库·mysql
网络工程小王2 小时前
【LLM开发实验】FastAPI 学习笔记
数据库·笔记·学习·mysql·fastapi
Aime_Perfect2 小时前
sqlserver always on
服务器·数据库·sqlserver
摘星编程2 小时前
从“数据出库“到“模型入库“:DolphinDB 库内机器学习全流程实践
数据库
Sagittarius_A*2 小时前
【好靶场】SQL注入-时间盲注
数据库·sql