浅谈解析什么是MySQL的表锁和行锁机制

mysql INSERT INTO时的锁 操作,也只有成功提交的操作才会对表产生影响。而且,在事务内部,其他线程只能查看事务开始前的数据状态,无法看到正在进行的中间状态。将不会触发,因为这将导致一个错误,因为自增主键值已经存在。在这种情况下,你需要先检查记录是否存在,如果不存在,再执行插入操作。提交事务)来确保在事务执行过程中,只有持有事务的线程可以对表进行写操作。操作时直接锁定整个表,确保在同一时间只有一个线程可以对表进行写操作。如果表中有一个自增的主键,并且你尝试插入一个已经存在的值,那么。是唯一的,并且已经存在,那么。 阅读详情

众所周知,MySQL的存储引擎有MyISAM和InnoDB,锁粒度分别是表锁和行锁。

后者的出现从某种程度上是弥补前者的不足,比如:MyISAM不支持事务,InnoDB支持事务。表锁虽然开销小,锁表快,但高并发下性能低。行锁虽然开销大,锁表慢,但高并发下相比之下性能更高。事务和行锁都是在确保数据准确的基础上提高并发的处理能力。下面分别进行介绍:

行锁

行锁的劣势:

  • 开销大;

  • 加锁慢;

  • 会出现死锁

行锁的优势:

  • 锁的粒度小,发生锁冲突的概率低;

  • 处理并发的能力强

加锁的方式:

  • 自动加锁:对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;

  • 无锁:对于普通SELECT语句,InnoDB不会加任何锁;当然我们也可以显示的加锁:

  • 共享锁:select * from tableName where ... + lock in share more

  • 排他锁:select * from tableName where ... + for update

InnoDB和MyISAM的最大不同点有两个:

  • InnoDB支持事务(transaction);

  • 默认采用行级锁。

加锁可以保证事务的一致性,下面我们来学习一下MySQL的事务知识.

MySQL 事务属性

事务是由一组SQL语句组成的逻辑处理单元,事务具有ACID属性。 原子性(Atomicity):事务是一个原子操作单元。在当时原子是不可分割的最小元素,其对数据的修改,要么全部成功,要么全部都不成功。 一致性(Consistent):事务开始到结束的时间段内,数据都必须保持一致状态。 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行。 持久性(Durable):事务完成后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

事务常见问题

更新丢失(Lost Update) 原因:当多个事务选择同一行操作,并且都是基于最初选定的值,由于每个事务都不知道其他事务的存在,就会发生更新覆盖的问题。类比github提交冲突。

脏读(Dirty Reads) 原因:事务A读取了事务B已经修改但尚未提交的数据。若事务B回滚数据,事务A的数据存在不一致性的问题。

不可重复读(Non-Repeatable Reads) 原因:事务A第一次读取最初数据,第二次读取事务B已经提交的修改或删除数据。导致两次读取数据不一致。不符合事务的隔离性。

幻读(Phantom Reads) 原因:事务A根据相同条件第二次查询到事务B提交的新增数据,两次数据结果集不一致。不符合事务的隔离性。

幻读和脏读有点类似 脏读是事务B里面修改了数据, 幻读是事务B里面新增了数据。

事务的隔离级别

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大。这是因为事务隔离实质上是将事务在一定程度上"串行"进行,这显然与"并发"是矛盾的。根据自己的业务逻辑,权衡能接受的最大副作用。从而平衡了"隔离" 和 "并发"的问题。MySQL默认隔离级别是可重复读。 脏读,不可重复读,幻读,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

+------------------------------+---------------------+--------------+--------------+--------------+ | 隔离级别 | 读数据一致性 | 脏读 | 不可重复 读 | 幻读 | +------------------------------+---------------------+--------------+--------------+--------------+ | 未提交读(Read uncommitted) | 最低级别 | 是 | 是 | 是 | +------------------------------+---------------------+--------------+--------------+--------------+ | 已提交读(Read committed) | 语句级 | 否 | 是 | 是 | +------------------------------+---------------------+--------------+--------------+--------------+ | 可重复读(Repeatable read) | 事务级 | 否 | 否 | 是 | +------------------------------+---------------------+--------------+--------------+--------------+ | 可序列化(Serializable) | 最高级别,事务级 | 否 | 否 | 否 | +------------------------------+---------------------+--------------+--------------+--------------+ 复制代码

查看当前数据库的事务隔离级别:show variables like 'tx_isolation';

mysql> show variables like 'tx_isolation'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 复制代码

间隙锁

当我们用范围条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做"间隙(GAP)"。InnoDB也会对这个"间隙"加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。

Transaction-A mysql> update innodb_lock set k=66 where id >=6; Query OK, 1 row affected (0.63 sec) mysql> commit; ​ Transaction-B mysql> insert into innodb_lock (id,k,v) values(7,'7','7000'); Query OK, 1 row affected (18.99 sec) 复制代码

危害(坑):若执行的条件是范围过大,则InnoDB会将整个范围内所有的索引键值全部锁定,很容易对性能造成影响。

排他锁

排他锁,也称写锁,独占锁,当前写操作没有完成前,它会阻断其他写锁和读锁。

​

# Transaction_A mysql> set autocommit=0; mysql> select * from innodb_lock where id=4 for update; +----+------+------+ | id | k | v | +----+------+------+ | 4 | 4 | 4000 | +----+------+------+ 1 row in set (0.00 sec) ​ mysql> update innodb_lock set v='4001' where id=4; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 ​ mysql> commit; Query OK, 0 rows affected (0.04 sec) # Transaction_B mysql> select * from innodb_lock where id=4 for update; +----+------+------+ | id | k | v | +----+------+------+ | 4 | 4 | 4001 | +----+------+------+ 1 row in set (9.53 sec) 复制代码

共享锁

共享锁,也称读锁,多用于判断数据是否存在,多个读操作可以同时进行而不会互相影响。当如果事务对读锁进行修改操作,很可能会造成死锁。如下图所示。

​# Transaction_A mysql> set autocommit=0; mysql> select * from innodb_lock where id=4 lock in share mode; +----+------+------+ | id | k | v | +----+------+------+ | 4 | 4 | 4001 | +----+------+------+ 1 row in set (0.00 sec) ​ mysql> update innodb_lock set v='4002' where id=4; Query OK, 1 row affected (31.29 sec) Rows matched: 1 Changed: 1 Warnings: 0 # Transaction_B mysql> set autocommit=0; mysql> select * from innodb_lock where id=4 lock in share mode; +----+------+------+ | id | k | v | +----+------+------+ | 4 | 4 | 4001 | +----+------+------+ 1 row in set (0.00 sec) ​ mysql> update innodb_lock set v='4002' where id=4; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 复制代码

分析行锁定

通过检查InnoDB_row_lock 状态变量分析系统上的行锁的争夺情况 show status like 'innodb_row_lock%'

mysql> show status like 'innodb_row_lock%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 0 | | Innodb_row_lock_time_avg | 0 | | Innodb_row_lock_time_max | 0 | | Innodb_row_lock_waits | 0 | +-------------------------------+-------+ 复制代码

innodb_row_lock_current_waits: 当前正在等待锁定的数量 innodb_row_lock_time: 从系统启动到现在锁定总时间长度;非常重要的参数, innodb_row_lock_time_avg: 每次等待所花平均时间;非常重要的参数, innodb_row_lock_time_max: 从系统启动到现在等待最常的一次所花的时间; innodb_row_lock_waits: 系统启动后到现在总共等待的次数;非常重要的参数。直接决定优化的方向和策略。

行锁优化

1 尽可能让所有数据检索都通过索引来完成,避免无索引行或索引失效导致行锁升级为表锁。 2 尽可能避免间隙锁带来的性能下降,减少或使用合理的检索范围。 3 尽可能减少事务的粒度,比如控制事务大小,而从减少锁定资源量和时间长度,从而减少锁的竞争等,提供性能。 4 尽可能低级别事务隔离,隔离级别越高,并发的处理能力越低。

表锁

表锁的优势:开销小;加锁快;无死锁 表锁的劣势:锁粒度大,发生锁冲突的概率高,并发处理能力低 加锁的方式:自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁。也可以显示加锁: 共享读锁:lock table tableName read; 独占写锁:lock table tableName write; 批量解锁:unlock tables;

共享读锁

对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读操作,但会阻塞对同一表的写操作。只有当读锁释放后,才能执行其他进程的写操作。在锁释放前不能取其他表。

​Transaction-A mysql> lock table myisam_lock read; Query OK, 0 rows affected (0.00 sec) ​ mysql> select * from myisam_lock; 9 rows in set (0.00 sec) ​ mysql> select * from innodb_lock; ERROR 1100 (HY000): Table 'innodb_lock' was not locked with LOCK TABLES ​ mysql> update myisam_lock set v='1001' where k='1'; ERROR 1099 (HY000): Table 'myisam_lock' was locked with a READ lock and can't be updated ​ mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) Transaction-B mysql> select * from myisam_lock; 9 rows in set (0.00 sec) ​ mysql> select * from innodb_lock; 8 rows in set (0.01 sec) ​ mysql> update myisam_lock set v='1001' where k='1'; Query OK, 1 row affected (18.67 sec) 复制代码

独占写锁

对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。在锁释放前不能写其他表。

​

 

Transaction-A mysql> set autocommit=0; Query OK, 0 rows affected (0.05 sec) ​ mysql> lock table myisam_lock write; Query OK, 0 rows affected (0.03 sec) ​ mysql> update myisam_lock set v='2001' where k='2'; Query OK, 1 row affected (0.00 sec) ​ mysql> select * from myisam_lock; 9 rows in set (0.00 sec) ​ mysql> update innodb_lock set v='1001' where k='1'; ERROR 1100 (HY000): Table 'innodb_lock' was not locked with LOCK TABLES ​ mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) Transaction-B mysql> select * from myisam_lock; 9 rows in set (42.83 sec) 复制代码

总结:表锁,读锁会阻塞写,不会阻塞读。而写锁则会把读写都阻塞。

查看加锁情况

show open tables; 1表示加锁,0表示未加锁。

mysql> show open tables where in_use > 0; +----------+-------------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------------+--------+-------------+ | lock | myisam_lock | 1 | 0 | +----------+-------------+--------+-------------+ 复制代码

分析表锁定

可以通过检查table_locks_waited 和 table_locks_immediate 状态变量分析系统上的表锁定:show status like 'table_locks%'

mysql> show status like 'table_locks%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Table_locks_immediate | 104 | | Table_locks_waited | 0 | +----------------------------+-------+ 复制代码

table_locks_immediate: 表示立即释放表锁数。 table_locks_waited: 表示需要等待的表锁数。此值越高则说明存在着越严重的表级锁争用情况。

此外,MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的存储引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永久阻塞。

什么场景下用表锁

InnoDB默认采用行锁,在未使用索引字段查询时升级为表锁。MySQL这样设计并不是给你挖坑。它有自己的设计目的。 即便你在条件中使用了索引字段,MySQL会根据自身的执行计划,考虑是否使用索引(所以explain命令中会有possible_key 和 key)。如果MySQL认为全表扫描效率更高,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。

第一种情况:全表更新。事务需要更新大部分或全部数据,且表又比较大。若使用行锁,会导致事务执行效率低,从而可能造成其他事务长时间锁等待和更多的锁冲突。

第二种情况:多表级联。事务涉及多个表,比较复杂的关联查询,很可能引起死锁,造成大量事务回滚。这种情况若能一次性锁定事务涉及的表,从而可以避免死锁、减少数据库因事务回滚带来的开销。

页锁

开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发处理能力一般。只需了解一下。

总结

1 InnoDB 支持表锁和行锁,使用索引作为检索条件修改数据时采用行锁,否则采用表锁。 2 InnoDB 自动给修改操作加锁,给查询操作不自动加锁 3 行锁可能因为未使用索引而升级为表锁,所以除了检查索引是否创建的同时,也需要通过explain执行计划查询索引是否被实际使用。 4 行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟锁的粒度小。 5 当表的大部分数据需要被修改,或者是多表复杂关联查询时,建议使用表锁优于行锁。 6 为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接影响到一个数据库的并发处理能力和性能。

CocosCreator视频播放黑屏?手把手教你封装VideoPlayer组件解决Web环境问题 本文针对Cocos Creator在Web环境下视频播放黑屏等常见问题,提供了一套工程化的VideoPlayer组件封装解决方案。文章深入剖析了浏览器自动播放策略、DOM样式隔离等核心挑战,并手把手教你实现一个健壮的管理器,涵盖兼容性处理、性能优化与内存管理,确保视频播放稳定流畅。 阅读详情

相关推荐

从零到一:NI USB-8506 LIN通讯的驱动安装与硬件调试全攻略

本文详细介绍了NI USB-8506 LIN通讯设备的驱动安装与硬件调试全流程,包括硬件准备、驱动下载与配置、NI MAX设置及常见问题解决方案。通过实战应用与性能优化技巧,帮助用户快速掌握LIN通讯技术,适用于车载数据记录和自动化测试等场景。

weixin_28273593的博客 926

MySql锁—表锁、行锁

MySql内部锁定方法

深圳市多克创新科技有限公司 1770

避坑指南:GROMACS模拟中.tpr、.xtc、.edr、.cpt文件你用对了吗?从生成到分析全流程解析

本文详细解析GROMACS分子动力学模拟中.tpr、.xtc、.edr、.cpt等核心文件的使用技巧,从文件生成到轨迹优化、能量分析的全流程避坑指南。重点介绍拓扑文件校验、轨迹格式选择、周期性边界处理等实战经验,帮助科研人员高效管理模拟数据并准确提取关键能量信息。

weixin_30631587的博客 118

mysql事务锁表还是锁行

mysql事务锁表还是锁行

DSJ1996的博客 1821

5张图,搞懂三方支付机构的“备付金账户”体系

本文将详细解析第三方支付机构各类备付金账户的功能定位、所承载的支付业务处理流程以及日常管理。

银行信息系统应用架构详解 2150

SIGIR 2026:信息检索前沿技术与投稿指南

信息检索(Information Retrieval, IR)是计算机科学中处理大规模数据检索的核心技术,其基本原理是通过算法模型从海量数据中高效提取相关信息。随着深度学习的发展,神经信息检索(Neural IR)和多模态检索成为研究热点,如稠密检索模型(DPR)和跨模态预训练(CLIP)等技术的应用显著提升了检索精度。这些技术不仅在学术领域具有重要价值,还在电商搜索、医疗检索等实际场景中展现出巨大潜力。SIGIR作为信息检索领域的顶级会议,汇聚了全球顶尖学者和工业界专家,是展示最新研究成果的重要平台。本文

weixin_29189363的博客 291

【转】MySQL 表锁和行锁机制

 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。通过本章内容,带你学习MySQL的行锁,表锁,两种锁的优缺点,行锁变表锁的原因,以及开发中需要注意的事项。还在等啥?经验等你来拿!   MySQL的存储引擎是从MyISAM到InnoDB,锁从表锁到行锁。后者的出现从某种程度上是弥补前者的不足。比如:MyISAM不...

路漫漫其修远兮 533

AutoSAR系列讲解(入门篇)2.1-AppL概述

该章主要是讲解SWC是如何在ECU中分布的

雪云飞星的博客 4万+

Mysql加锁流程详解&MySQL 啥时候用表锁,啥时候用行锁?

前面已经给大家分享了Mysql中有哪些锁、锁的分类以及相互间的兼容性。本节继续分享Mysql的加锁流程。由于InnoDB引擎才支持行级锁,以下内容都是基于InnoDB引擎介绍。本文主要对Mysql加锁流程进行了详细说明。1、了解锁的内存结构,注意行锁是可以合并的,并不需要为每条记录都添加一个锁。2、熟悉根据主键查询加锁,根据二级索引查询加锁,以及不走索引的查询的加锁规律。3、通过data_locks表查看加锁信息。Innodb 啥时候用表锁,啥时候用行锁?表级锁包括:表锁、元数据锁、意向锁。

qq_43842093的博客 5994

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1237

逆向工具:一文讲述 Ghidra 的详细使用

Ghidra是由NSA开源的一款功能强大的逆向工程框架,支持多平台、多架构和多种文件格式分析。本文详细介绍了Ghidra的核心优势、安装配置方法、主界面功能模块,并通过一个CrackMe示例演示了完整的逆向分析流程。文章还讲解了高级功能如交叉引用、控制流图分析、数据类型重建和脚本自动化等,最后提供了常见文件格式的分析技巧。作为IDA Pro的免费替代方案,Ghidra适合个人学习、教学和中小项目使用。(149字)

数据知道的博客 4353

浅谈MySQL的各种锁

提起MySQL的锁,大家都不会佰生,这是个老生常谈的话题。本文将对MySQL/innodb常见的锁做一个大致的分类,并结合SQL实例进行分析。 #锁的模式 S锁(共享锁) 又称读锁,若记录被某事务加上了S锁,允许其它事务对其加S锁,但不允许其他事务再加X锁。 加锁方式:select…lock in share mode X锁(排他锁) 又称写锁,若记录被某事务加上了X锁,不允许其他事务再加S锁或者X锁 加锁方式:select…for update 简记:读读可以并行,读写/写写互斥 IS(意向共享锁)和I

一群专业码农的笔记本 1143

DirectX function “GetDeviceRemovedReason“ failed with DXGI_ERROR_DEVICE_HUNG (“The GPU will not resp

游戏报错"DXGI_ERROR_DEVICE_HUNG"的解决方案 在使用RTX 40系显卡运行FIFA 23等游戏时,可能出现DirectX报错导致游戏崩溃。这主要由于最新显卡驱动与DirectX 12的兼容性问题。解决方法包括: 降级显卡驱动版本 修改游戏配置文件,将DIRECTX_SELECT设为1 在显卡控制面板中关闭垂直同步、抗锯齿、DLSS 3等功能 调整电源模式为性能优先 这些操作可以有效解决因驱动兼容性导致的游戏崩溃问题。

猿小白的博客 3895

浅谈事务隔离级别与锁机制

数据库中通常会存在并发执行多个事务的情况,而这些并发的事务如果操作的有相同的数据,就会导致脏写、脏读等问题。MySQL为了解决数据库并发事务导致的脏写、脏读、不可重复读、幻读等问题,设计了事务隔离等级、锁机制和MVCC(多版本并发控制)机制,通过一整套的机制来解决多事务并发问题。 一、数据库事务 1.1 事务特性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下四大特性,称为事务的ACID特性: 原子性:事务是一个原子操作单元,其内部的SQL语句要么全部执行成功,要么都不执行 一致性:在事务开始和完

sermonlizhi的博客 1908

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java Web数据库篇之漫谈MySQL锁

1、锁分类 1.1、悲观锁 释义 就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 如何应用 需要使用数据库的锁机制,如行锁中的共享锁(S锁)、互斥锁(X锁),还有意向锁(IS锁、IX锁) select * from ...

聚沙成塔 1164

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

浅谈MYSQL存储引擎及锁机制

浅谈MYSQL存储引擎及锁机制Mysql存储引擎MYISAM 跟 InnoDB的区别锁机制实验:读锁与写锁的差异创建读锁与写锁创建全局锁总结差异 Mysql存储引擎 Mysql支持的存储引擎 show engines MariaDB [(none)]> SHOW ENGINES; +--------------------+---------+-------------------...

黑白一戒 589

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mysql锁

mysql锁 宏观 数据库锁 粒度小,方便用于集群环境 代码锁 粒度大,需要封装 微观 innodb 分类(种类) for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。 行锁&表锁 `只有明确指定主键,才会执行行锁,否则执行表锁` 无锁 `主键不存在...

qq_18615185的博客 188

浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景 一、相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁(抽象性,不真实存在这个锁) |--乐观锁(抽象性,不真实存在这个锁) 二、InnoDB与MyISAM Mysql 在5....

localhost01 4万+

浅谈MySQL事务

前话 Mysql的事务管理默认关闭(自动事务,数据改动会立即入库)。 在Innodb中,每开启一个事务,都会为该session分配一个事务对象。ReadView(视图)来判断事务的可见性(ACID中的隔离性),视图中包含事务ID、事务ID数组。 查询当前有多少事务正在运行。 select * from information_schema.innodb_trx; 查看自动事务的开启情况 show variables like 'autocommit'; 事务启动方式: 1、显式:begin、st.

weixin_42679286的博客 554

浅谈MySQL行级锁和表级锁

MySQL行级锁和表级锁 锁定用于确保事务完整性和数据库一致性。 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据。 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能会产生想不到的结果。 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。 行级锁

weixin_41657954的博客 2339

浅谈MySQL中的锁

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数...

Kru的博客 251

mysql 锁_浅谈MySQL的七种锁

一、共享锁(S锁)/排他锁(X锁)事务拿到某一行记录的共享S锁,才可以读取这一行,并阻止别的事物对其添加X锁事务拿到某一行记录的排它X锁,才可以修改或者删除这一行共享锁的目的是提高读读并发排他锁的目的是为了保证数据的一致性二、意向锁1、意向共享锁预示事务有意向对表中的某些行加共享S锁2、意向排他锁预示着事务有意向对表中的某些行加排他X锁3、 IS、S、IX、X锁之间的兼容性比较:兼容性ISIXSX...

weixin_39540023的博客 363

MySQL 锁机制及原理

参考资料 zhoulujun-再谈mysql锁机制及原理—锁的诠释 简书-通过MySQL存储原理来分析排序和锁 博客园-关于MySQL锁的详解 博客园-Mysql锁原理浅谈

不积小流,无以成江海。 160

一步一步带你入门 MySQL 中的索引和锁

优质文章,及时送达作者 | FrancisQ链接 | juejin.im/post/5db19103e51d452a300b14c9索引索引常见的几种类型索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等。本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结构。InnoDB的索引结构在InnoDB中是通过一种多路搜索树——B+树实现索引结构的。在B+树中是只有叶子结点会存储数...

公众号:Java后端 314

技本功丨浅谈MySQL的七种锁

作者:宋丹琪(花名:三思)袋鼠云云服务部DBA团队 数据库工程师 时常会有开发的同学突然紧张兮兮地找我, 然后丢给我一个代码层面的 CannotAcquireLockException的报错, 一脸无辜地问我是不是自己搞出了一个死锁。 好像大家看到LOCK的字眼 总会...

chudufan0339的博客 103

Mysql锁与事务隔离级别_MySQL实战14 深入理解Mysql锁与事务隔离级别

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

weixin_28987547的博客 154
上一篇: 8000字带你了解Java开发中有哪些常用的注解与它们的作用
下一篇: 简短解析浅述SpringBoot六边形架构案例
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值