Mysql 数据库的锁机制分析

性能调优之数据库调优-数据库的锁机制 MySQL:使用和INNODB_TRX表。​PostgreSQL:使用pg_locks和视图。​SQL Server:使用和动态管理视图。​Oracle:使用v$session视图。​MongoDB:使用命令。​Redis:使用INFO命令。 阅读详情

Mysql 数据库的锁机制分析

一、问题背景

1. 为什么要加锁?

  • 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

2.要解决的问题

  • 多用户环境下保证数据库完整性和一致性

二、锁是什么

  • 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。
  • 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

三、锁的分类

1.行级锁

  • 行级锁
  • 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
  • 特点
  • 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

2.表级锁

  • 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
  • 特点
  • 开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

3.页级锁

  • 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁
  • 特点
  • 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

四、MySQL常用存储引擎的锁机制

1. MyISAM和MEMORY采用表级锁(table-level locking)

2. BDB采用页面锁(page-level locking)或表级锁,默认为页面锁

3. InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

  • InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。

行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。

实例说明

  • MySQL InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁。

  • select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。

  • 所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

4. 行级锁与死锁

  • MyISAM中是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成了死锁的可能。

  • 在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。

  • 当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。

  • 发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。

5. 共享锁与排它锁

共享锁(Share Lock)
  • 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

  • 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

  • 用法 SELECT ... LOCK IN SHARE MODE

  • 在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

排它锁(eXclusive Lock)
  • 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

用法 SELECT … FOR UPDATE;

在查询语句后面增加FOR UPDATE,Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

6. 乐观锁(Optimistic Lock)

是什么

  • 假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。

实现数据版本有两种方式,** 第一种是使用版本号,第二种是使用时间戳 **。

使用版本号实现乐观锁
  • 使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作。并判断当前版本号是不是该数据的最新的版本号。
1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};

优点与不足

  • 乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题

7. 悲观锁(Pessimistic Lock)

是什么

  • 在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制 (也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

悲观锁的流程

  • 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。
  • 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。具体响应方式由开发者根据实际需要决定。
  • 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。
  • 其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。

MySQL InnoDB中使用悲观锁

  • 要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。set autocommit=0;
//0.开始事务
begin;
//1.查询出商品信息
select status from t_goods where id=1 for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务
commit;

上面的查询语句中,我们使用了select…for update的方式,这样就通过开启排他锁的方式实现了悲观锁。此时在t_goods表中,id为1的 那条数据就被我们锁定了,其它的事务必须等本次事务提交之后才能执行。这样我们可以保证当前的数据不会被其它事务修改。

python相关具体实现

感谢作者!

[MySQL高级](六) 锁机制 1. 概述 1.1 定义   锁时计算机协调多个进程或线程并发访问某一资源的机制。   在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 1.2 应用 ... 阅读详情

相关推荐

ORBSLAM3运行记录(单目+IMU)

ORBSLAM3运行记录1.单目+IMU数据集运行记录自己做的其它测试2.单目+IMU自己采集数据运行记录测试结果 1.单目+IMU数据集运行记录 ORBSLAM3没有预留ROS下单目+IMU的结点,这个需要自己去写代码添加,可以参考这篇博客,《ORBSLAM3 用ROS接口运行双目IMU和单目IMU模式》。我的ROS结点为Mono-IMU,字典文件ORBvoc.txt在ORBSLAM3 / Vocabulary文件夹中,配置文件EuRoC.yaml在ORB_SLAM3 / Examples / Monoc

yys2324826380的博客 1万+

MySQL锁 详解

MySQL锁 1.锁的概念 之前我们学习过多线程,多线程当中如果想保证数据的准确性是如何实现的呢?没错,通过同步实现。同步就相当于是加锁。加了锁以后有什么好处呢?当一个线程真正在操作数据的时候,其他线程只能等待。当一个线程执行完毕后,释放锁。其他线程才能进行操作! 那么我们的MySQL数据库中的锁的功能也是类似的。在我们学习事务的时候,讲解过事务的隔离性,可能会出现脏读、不可重复读、幻读的问题,当时我们的解决方式是通过修改事务的隔离级别来控制,但是数据库的隔离级别呢我们并不推荐修改。所以,锁的作用也

JAVA开发者@邢先生 332

import-im6.q16: attempt to perform an operation not allowed by the security policy `PS‘ @ error/cons

这六个 policy 是使用 XML 格式描述的安全策略。要将其中的限制注释掉,在每个 policy 开始和结束的标记之间添加注释标记“

m0_60657960的博客 1909

在MySQL中使用分布式锁进行数据同步与同步控制

同时,可以通过使用锁超时和死锁处理机制,避免死锁的发生。SELECT FOR UPDATE是MySQL提供的一种锁机制,它可以锁定指定的行或者表,在事务结束前其他事务无法对其进行修改。在分布式系统中,多个应用可能同时对数据库进行读写操作,为了避免数据的冲突和并发问题,需要引入分布式锁。当一个事务执行到FOR UPDATE语句时,如果其他事务已经锁定了相同的行,那么当前事务会被挂起,直到其他事务释放锁为止。首先,在需要进行同步操作的事务中,使用SELECT FOR UPDATE语句锁定需要同步的行或者表。

vipfanxu的博客 356

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

STM32H743+YT8512C以太网通信实战:CubeMX与LWIP配置详解

本文详细解析了基于STM32H743微控制器与YT8512C PHY芯片的以太网通信实战方案。通过CubeMX工具进行RMII接口、MPU、时钟树等关键硬件配置,并重点阐述了如何修改LWIP协议栈驱动代码以适配YT8512C芯片,解决了LAN8742驱动不兼容的问题。文章提供了从工程创建、代码适配到调试验证的完整步骤,帮助开发者快速实现稳定可靠的嵌入式网络连接。

weixin_29190573的博客 560

MySQL锁机制

一、MyISAM的锁机制(表锁) 在MyISAM中,当前会话查询一个表中的数据时,会将该表设置为读锁,当前会话可以查询表中的数据,但不能修改,也不能对其他表进行操作,需要提交后即可;其他会话也可以查询该表的数据,但不能修改该表的数据,但是可以对其他表进行操作。 在当前会话中,如果修改表中的数据,会将该表设置为写锁,当前会话可以查询表中的数据,也可以对表中的数据进行操作,但是不能对其他表进行操作,需要提交后即可;其他会话不能对该表进行查询的操作,如果进行了查询,处于阻塞状态,需要等待第一个会话提交后方可查询。

weixin_44256581的博客 231

OpenNARS开源通用人工智能系统:非公理推理引擎实践指南

人工智能系统从基于规则推理到深度学习模型,始终围绕如何让机器具备智能决策能力。传统逻辑系统依赖公理和完备知识,而现实世界智能体需要在资源受限、信息不完备环境下进行推理。非公理推理系统(NARS)通过动态真值计算和信念修正机制,实现了在不确定性环境下的自主学习和决策。这种推理引擎的技术价值在于模拟人类思维的核心机制——归纳、演绎和学习,为通用人工智能(AGI)提供了不同于数据驱动的新路径。在应用场景上,NARS适用于游戏NPC决策、复杂系统故障诊断和自适应机器人控制等领域。OpenNARS作为NARS理论的开

weixin_31961675的博客 408

解决并发冲突:Java实现MySQL数据锁定策略

在并发环境下,多个线程同时对MySQL数据库进行读写操作可能会导致数据冲突和不一致的问题。为了解决这些并发冲突,我们可以采用数据锁定策略来保证数据的一致性和完整性。下面将介绍如何使用Java实现MySQL数据锁定策略,以及相关的注意事项和最佳实践。

Z__7Gk的博客 1259

精确时钟同步协议ptp/IEEE-1588v2协议-------(1)简介

ptp, 1588V2, IEEE-1588, 精确时钟同步协议

meihualing的专栏 5360

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文深度解析了青龙人形机器人硬件平台的设计全流程,从需求分析、构型设计到核心系统实现。文章详细阐述了其43个自由度的仿生构型、高动态性下肢设计、灵巧作业系统以及分布式控制架构,并探讨了旋转关节与直线关节等关键技术选型,为开发者提供了从理论到实践的完整硬件设计指南。

weixin_29248313的博客 383

Java学习(锁机制)

锁机制 对象锁:同步方法,锁住的对象 全局锁:类锁,静态方法,锁住的是class类 synchronized使用场景 用于实现代码的同步处理,保持可见性、有序性和原子性 数据不安全的2个条件:共享的临界资源、多线程同时访问并改变数据 synchronized三种形式 synchronized修饰普通方法,锁对象是当前对象 synchronized修饰静态方法,锁对象是当前类 synchronized修饰同步代码块,锁对象是synchronized后面括号中的配置对象 当时有synchronized修饰同步代

weixin_48079072的博客 240

TP4056锂电池充电电路设计原理与工程实践

锂离子电池充电管理是嵌入式电源系统的核心基础技术,其本质是通过恒流恒压(CC/CV)控制策略,匹配电池电化学特性以实现安全、高效、长寿命充放电。TP4056作为典型线性充电IC,以精简外围实现预充、恒流、恒压及自动截止全周期管理,但受限于线性拓扑的热耗散特性,必须协同散热设计、电阻精度选型与PCB布局进行系统级优化。该方案广泛应用于STM32智能小车、便携传感器节点等3.7V单节锂电供电场景,兼顾成本、可靠性与工程可实施性,是入门嵌入式硬件电源设计的关键实践范例。

weixin_36064575的博客 224

【数据库】【MySQL】锁机制深度解析:从原理到死锁分析实战

本文深入解析MySQL锁机制,重点剖析InnoDB引擎的锁实现。内容涵盖锁分类全景图(全局锁、表级锁、行级锁)、核心锁类型(共享锁/排他锁/意向锁)及兼容性矩阵,详细解释行级锁的四种实现(记录锁/间隙锁/临键锁/插入意向锁)。通过实战场景展示不同SQL语句的加锁情况,分析元数据锁(MDL)导致的阻塞问题,并提供死锁日志的开启方法与结构解析。文章构建了从锁原理到死锁分析的完整知识体系,帮助开发者深入理解MySQL并发控制机制。

瘦到被风吹走的博客 1418

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据库事务与锁机制详解:db-tutorial 并发控制实战

在当今高并发的应用场景中,数据库事务与锁机制是确保数据一致性和系统稳定性的核心技术。本文将深入解析db-tutorial项目中的并发控制实战,帮助开发者掌握事务隔离级别、锁类型及其应用场景。🚀 ## 什么是数据库事务? 数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么全部成功,要么全部失败。事务具有ACID四大特性: - **原子性**:事务中的所有操作要么全部完成,要么全部不完成

gitblog_00556的博客 657

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据库之mysql事务原理分析与锁机制 详解

1、事务 1.2、目的 事务将数据库从一种一致性状态转换为另一种一致性状态; 1.3、组成 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成; 其中单条语句会默认自动添加事务控制语句,而多条SQL语句需要手动添加事务控制语句。 1.4、特征 在数据库提交事务时,可以确保要么所有修改都已经保存,要么所有修改都不保存; 事务是访问并更新数据库各种数据项的一个程序执行单元。 在 MySQL innodb 下,每一条语句都是事务;可以通过 set autocommit = 0; 设置当前会话手

asdaqqwc的博客 532

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Oracle vs MySQL vs PG:三大数据库锁机制深度对比(附死锁案例分析)

本文深度对比了Oracle、MySQL和PostgreSQL三大数据库的锁机制,包括基础架构、电商秒杀场景实战、银行转账死锁案例分析及性能优化策略。通过真实案例和性能测试数据,帮助DBA和开发者理解不同数据库在并发控制上的差异,并提供实用的避坑指南和优化建议。

weixin_28698059的博客 131

数据库—MySQL调优

MySQL不支持full join,但可以使用 全左 与 全右 的 union并集索引(index)是帮助MySQL高效获取数据的数据结构,即索引=数据结构索引的目的:提高查询效率,类似于字典。索引:排好序的 快速查找数据结构。索引会影响到where后面的查找 和 order by后面的排序在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(即指针)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

Eris_QwQ的博客 1001

尚硅谷MySQL数据库高级-目录

尚硅谷MySQL数据库高级-01-mysq1的架构介绍 尚硅谷MySQL数据库高级-02-索引优化分析 尚硅谷MySQL数据库高级-03-查询截取分析 尚硅谷MySQL数据库高级-04-MySQL锁机制 尚硅谷MySQL数据库高级-05-主从复制 ...

admin741admin的博客 217

mysql锁机制

概述 三锁 表锁(偏读) 行锁(偏写) 页锁

无畏D尘埃 411

MySQL原理与实践(五):数据库的锁机制

(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.youkuaiyun.com/article/details/91345678冷血之心的博客) 关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~ 快速导航: MySQL原理与实践(一):一条select语句引出Server层和存储引擎层 MySQL原理与实践(二):一条update语句引...

冷血之心的博客 6319

深入解析 MySQL 锁机制:从原理到实践

在高并发的数据库应用中,MySQL 锁机制扮演着至关重要的角色,它直接影响着数据库的并发性能和数据一致性。很多开发者在面对死锁、性能瓶颈等问题时,往往因为对锁机制理解不深入而无从下手。本文将从锁的基本概念出发,全面解析 MySQL 中不同类型的锁,包括表级锁、行级锁以及意向锁等,结合实际场景分析其工作原理和适用场景,最后给出锁机制的优化建议,帮助大家更好地理解和运用 MySQL 锁机制。​一、MySQL 锁机制的基本概念​在开始深入探讨之前,我们首先要明确什么是 MySQL 锁机制。简单来说,MySQL 锁

2301_81233042的博客 992

MySQL 的事务与锁机制详解

事务(Transaction)是指一组数据库操作的集合,这些操作要么全部成功,要么全部失败。事务确保了数据库操作的。

秋元的博客 1224

MySQL数据库的锁机制

使用数据库锁机制得目的 在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。  如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。 锁分类 按操作划分:DML锁,DDL锁 按锁的粒度划分:表级锁、行级锁、页级锁 按锁级别划分:共享锁、排他锁 按加锁方式划分:自动锁、显示锁 按使...

SileeLiu的博客 282

MySQL优化-MySQL常见的锁机制

MySQL优化-MySQL常见的锁机制

weixin_45226668的博客 1111

mysql innodb的锁机制分析

线上生产环境在某些时候经常性的出现数据库操作死锁,导致业务人员无法进行操作。经过DBA的分析,是某一张表的insert操作和delete操作发生了死锁。简单介绍下数据库的情况(因为涉及到真实数据,这里做了模拟,不影响具体的分析和分析的结果。)假设存在如下2张表:  Order 表的数据如下:    Customer表的数据如下:   Order和Custo

李晓蒙的博客 3815
上一篇: python新式类、旧式类
下一篇: JWT浅析
AggressionStorm
博客等级 码龄9年 6粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值