mysql数据库锁简介

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mysql数据库锁简介 乐观锁 乐观锁最常用的实现方式是用数据版本(Version)记录机制。数据版本即为数据增加一个版本标识,一般通过在数据库表中增加一个数字类型的 “version” 字段实现。

mysql数据库锁简介

乐观锁
乐观锁最常用的实现方式是用数据版本(Version)记录机制。数据版本即为数据增加一个版本标识,一般通过在数据库表中增加一个数字类型的 “version” 字段实现。读取数据时将version字段值一同读出,数据每更新一次,对version值加1,提交更新时将数据库表对应记录的当前version值与已取出的version值进行比对,如果数据库表当前version值与已取出的version值相等,则可以更新,否则认为是过期数据。
 
通常在实际项目中涉及金钱类的可能会使用这种乐观锁。
 
举例:
1、数据库表三个字段,分别是id、value、version
select id,value,version from table1 where id = #{id}
2、每次更新表中的value字段时为了防止发生冲突,需要这样操作
update table1
set value=2,version=version+1
where id=#{id} and version=#{version}
 
悲观锁
悲观锁认为在操作数据时会出现数据冲突,每次都要通过获取锁才能对相同数据进行操作,所以悲观锁需要耗费较多的时间。共享锁 和 排它锁 是悲观锁的不同实现,都属于悲观锁的范畴。
 
1、锁的粒度
 

InnoDB默认采用行锁,在未使用索引字段查询时升级为表锁行锁可能因为未使用索引而升级为表锁,所以除了检查索引是否创建的同时,也需要通过explain执行计划查询索引是否被实际使用。

 
2、读写锁

3、意向锁(Intention Locks)

为了实现多粒度锁机制,协调 行级读写锁 和 表级读写锁 (也就是不同粒度)之间的关系。意向锁是一种允许 行锁 与 表锁 共存的表锁。意向锁是由数据库引擎维护的,用户无法手动操作。在为数据行加 共享锁 / 排它锁 之前,InooDB 会先获取该数据行所在数据表的对应 意向锁。意向锁只会阻塞全表请求,主要目的是展示正在锁定表中一行,或者将要锁定一行。
 
意向锁分为两种:
 
意向共享锁(intention shared lock, IS):事务有意向对表中的某些行加共享锁(S锁)
-- 事务要获取某些行的 S 锁,必须先获得表的 IS 锁。
SELECT column FROM table1 ... LOCK IN SHARE MODE;
 
意向排它锁(intention exclusive lock, IX):事务有意向对表中的某些行加排它锁(X锁)
-- 事务要获取某些行的 X 锁,必须先获得表的 IX 锁。
SELECT column FROM table1 ... FOR UPDATE;
 
意向锁不会与行级的 共享/排它锁 互斥。

1) InnoDB 支持多粒度锁,特定场景下,行级锁 可以与 表级锁 共存。

2) 意向锁之间互不排斥,但除了 IS 与 S 兼容外,意向锁会与 共享锁 / 排它锁 互斥。
3) IX,IS是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,S发生冲突。
4) 意向锁在保证并发性的前提下,实现了行锁和表锁共存且满足事务隔离性的要求。
 
4、记录锁(Record Locks)
记录锁是在索引记录上的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 防止任何其他事务 插入、更新 或 删除 t.c1=10 的行。
 
5、间隙锁(Gap Locks)
间隙锁(gap)是索引记录之间上的锁,或者说第一个索引记录之前或最后一个索引记录之后的间隔上的锁。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; 阻止其他事务插入 t.c1 = 15 的记录,不管是否已经有这种值在本列中,因为这个范围内的所有值都被上锁了。
 
6、NK锁(Next-Key Locks)
NK锁是记录锁和间隙锁的组合,锁定一个范围,并且锁定记录本身。对查询范围进行加锁,在另一个事务执行插入操作时是不被运行的,从而避免了幻读。用于解决幻读问题。
 
InnoDB默认的事务隔离级别是Repeatable Read,此时InnoDB使用NK锁进行搜索和索引扫描,防止产生幻读
 
7、插入意向锁(Insert Intention Locks)
插入意向锁是在插入一条记录行前,由 INSERT 操作产生的一种间隙锁。该锁用以表示插入意向,当多个事务在同一区间(gap)插入位置不同的多条数据时,事务之间不需要互相等待。
 
插入意向锁本质上可以看成是一个间隙锁(Gap Lock)。
 
普通的Gap Lock 不允许 在(上一条记录,本记录)范围内插入数据
插入意向锁Gap Lock 允许 在(上一条记录,本记录)范围内插入数据
 
插入意向锁的作用是为了提高并发插入的性能, 多个事务 同时写入 不同数据 至同一索引范围(区间)内不需要等待其他事务完成,不会发生锁等待。
 
InnoDB 在 Repeatable Read 的事务隔离级别下,使用插入意向锁来控制和解决并发插入。
 
8、自增锁(AUTO-INC Locks)
自增锁是由插入到具有AUTO_INCREMENT列的表中的事务所采用的特殊表级锁。 在最简单的情况下,如果一个事务正在向表中插入值,任何其他事务必须等待,以便这个事务获得连续的主键值。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
57 3
|
4天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
28 8
|
20天前
|
SQL 存储 关系型数据库
数据库的行级锁与表锁?
表锁:存储引擎在SQL数据读写请求前对涉及的表加锁,分共享读锁和独占写锁,读锁阻塞写,写锁阻塞读写,易发锁冲突,并发性低。行级锁:InnoDB支持,通过索引加锁,提高并发性,但可能引起死锁,需注意索引使用,适用于避免不可重复读场景。
54 21
|
2月前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
126 1
|
2月前
|
SQL 关系型数据库 分布式数据库
Citus 简介,将 Postgres 转换为分布式数据库
【10月更文挑战第4天】Citus 简介,将 Postgres 转换为分布式数据库
107 4
|
2月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
70 3
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
90 3
|
2月前
|
Oracle 关系型数据库 MySQL
Mysql(1)—简介及Windows环境下载安装
MySQL 是一个流行的关系型数据库管理系统(RDBMS),基于 SQL 进行操作。它由瑞典 MySQL AB 公司开发,后被 Sun Microsystems 收购,现为 Oracle 产品。MySQL 是最广泛使用的开源数据库之一,适用于 Web 应用程序、数据仓库和企业应用。
64 2
|
2月前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
256 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
96 1