首页 > 数据库 >MySQL中的锁类型,乐观锁和悲观锁是什么

MySQL中的锁类型,乐观锁和悲观锁是什么

时间:2025-01-02 08:57:35浏览次数:3  
标签:事务 加锁 记录 乐观 并发 悲观 MySQL

MySQL中的锁类型丰富多样,可以根据不同的分类标准来划分。以下是对MySQL中锁类型的详细归纳,以及对乐观锁和悲观锁的具体解释:

一、MySQL中的锁类型

1. 按锁的粒度划分
  • 表锁:开销小,加锁快;锁定力度大,发生锁冲突的概率高,并发度最低;不会出现死锁。
  • 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
  • 页锁(页面锁):开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度也介于表锁和行锁之间,并发度一般。
2. 按锁的模式划分
  • 共享锁(S锁):又称读锁,允许一个事务读取一行数据,但不允许其他事务对该行数据增加排他锁。即一个事务给某行数据加了读锁,其他事务也可以读,但是不能写。
  • 排他锁(X锁):又称写锁,允许当前事务对数据行进行增删改查操作,不允许其他事务对增加了排他锁的数据行增加共享锁和排他锁。即一个事务给某行数据加了写锁,其他事务不能读,也不能写。
3. 按锁的算法划分
  • 记录锁(Record Lock):对索引记录加锁,锁定的是索引记录而不是物理记录。
  • 间隙锁(Gap Lock):对索引记录之间的间隙加锁,防止其他事务在这个间隙中插入新记录。
  • 临键锁(Next-Key Lock):记录锁和间隙锁的组合,用于解决幻读问题。它锁定的是索引记录以及索引记录前面的间隙。

此外,还有意向锁(分为意向共享锁和意向排他锁),这是表级锁,用于支持InnoDB的多粒度锁,解决表锁和行锁共存的问题。

二、乐观锁和悲观锁

1. 乐观锁
  • 定义:乐观锁并不是真正的锁,而是采用一种乐观的并发控制策略。它假设在大多数情况下,并发事务之间不会发生冲突。
  • 实现方式:通常是通过在数据表中增加一个版本号(version)字段来实现的。在更新数据时,会检查当前事务的版本号是否大于数据库表中对应记录的版本号,如果是,则进行更新操作,并将版本号加1;否则,认为发生了并发冲突,不进行更新。
  • 应用场景:适用于读多写少的场景,如电商系统中的商品浏览次数统计。
2. 悲观锁
  • 定义:悲观锁持一种悲观的态度,认为在并发环境中,数据很可能会被其他事务修改。因此,在事务开始时,就对要操作的数据进行加锁,直到事务完成并提交或回滚后才释放锁。
  • 实现方式:在MySQL中,可以使用SELECT ... FOR UPDATE语句来实现悲观锁。该语句会对满足条件的记录进行加锁,其他事务在尝试对这些记录进行更新操作时会被阻塞。
  • 应用场景:适用于写多读少且对数据一致性要求极高的场景,如银行系统的转账操作。

综上,MySQL中的锁类型多样,可以根据实际需求选择合适的锁类型来提高数据库的并发性能和数据一致性。同时,乐观锁和悲观锁作为两种重要的并发控制机制,各自适用于不同的应用场景。

标签:事务,加锁,记录,乐观,并发,悲观,MySQL
From: https://blog.csdn.net/x1234w4321/article/details/144566278

相关文章

  • MySQL概述和安装
    MySQL版本企业选择1、规范GA版本:稳定的发布版本2、版本类型E:企业版,收费版本,SR,偏传统行业C:社区版,开源版本,互联网企业的选择3、企业版本选择一般新上的环境,会选择GA6-12月版本4、企业主流版本5.6版本:5.6.345.6.365.6.38(Sep13,2017) 5.6.405.7版本:5.7.20(Sep......
  • MySQL日志体系的深度解析:功能与差异
    优质博文:IT-BLOG-CN一、binlogbinlog记录数据库表结构和表数据变更,比如update/delete/insert/truncate/create,它不会记录select。存储着每条变更的SQL语句和XID事务Id等等。binlog日志文件如下:[root@192.168.10.11]#mysqlbinlogmysql-binlog.0000012..........#at......
  • MySQL DBA需要掌握的 7 个问题
    1. MySQL适用的场景是什么?数据量建议单实例T级或以内,不依赖存储过程、函数、触发器的传统oltp场景都适用,因为是一个相对轻量级的数据库灾备使用MySQL各类的高可用方案即可,比如主从、mha、mgr等。2. MySQL巡检应该怎么做?优先关注哪些参数?可以从以下几个方面去做:服务器配......
  • Linux 虚拟机环境安装(jdk/mysql/redis/tomcat/nginx/挂载)
    =================================================================准备工作=================================================================yuminstallwgetyuminstall-ygcc-c++pcrepcre-develzlibzlib-developensslopenssl-develyuminstallchkconfi......
  • JAVA开源毕业设计 大学生竞赛管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T101,文末自助获取源码\color{red}{T101,文末自助获取源码}......
  • JAVA开源毕业设计 租房管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T102,文末自助获取源码\color{red}{T102,文末自助获取源码}......
  • 不再担心安装问题!手把手教你在 CentOS 上安装 MySQL 8
    目录......
  • Python+Django智慧农业小程序(Pycharm Flask Django Vue mysql)
    收藏关注不迷路,防止下次找不到!文章末尾有惊喜项目介绍当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统智慧农业采取了人工的管......
  • MySQL的事务
    MySQL的事务(Transaction)是一组操作的集合,这些操作作为一个单一的单元执行,要么全部成功,要么全部失败。事务在保证数据一致性和完整性方面发挥着重要作用,尤其在并发环境下确保数据的安全性和准确性。事务的四大特性:ACID原子性(Atomicity):事务中的操作要么全部执行,要么全部不......
  • MySQL数据库索引
    在MySQL中,索引是用于加速数据库查询操作的结构,它通过提供一个高效的查找路径来使得查询更加高效。数据库索引是基于某些字段或组合字段创建的数据结构,可以帮助MySQL更快地找到数据,减少扫描的行数。MySQL索引的类型主键索引(PrimaryKeyIndex)定义:主键索引是唯一的索引,每......