MySQL InnoDB之事务与锁详解

mysql_innoDB 事务与锁详解 立即下载

引题:为何引入事务?

1>.数据完整性

2>.数据安全性

3>.充分利用系统资源,提高系统并发处理的能力

1. 事务的特征

事务具有四个特性:原子性(Atomiocity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这四个特性简称ACID特性。

1.1原子性

事务是数据库的逻辑工作单位,事务中包括的所有操作要么都做,要么都不做。

1.2 一致性

事务执行的结果必须是使数据库从一个一致性的状态变到另外一个一致性状态。

1.3 隔离性

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他

事务是隔离的,并发执行的各个事务之间互相不干扰。

1.4 持久性

一个事务一旦成功提交,对数据库中数据的修改就是持久性的。接下来其他的其他

操作或故障不应该对其执行结果有任何影响。

2. MySQL的InnoDB引擎中事物与锁

2.1 SELECT …… LOCK IN SHARE MODE

会话事务中查找的数据,加上一个共享锁。若会话事务中查找的数据已经被其他会话事务加上独占锁的话,共享锁会等待其结束再加,若等待时间过长就会显示事务需要的锁等待超时。

2.2 SELECT ….. FOR UPDATE

会话事务中查找的数据,加上一个读更新琐,其他会话事务将无法再加其他锁,必须等待其结束。

2.3 INSERT、UPDATE、DELETE

会话事务会对DML语句操作的数据加上一个独占锁,其他会话的事务都将会等待其释放独占锁。

2.4 gap and next key lock(间隙锁)

InnoDB引擎会自动给会话事务中的共享锁、更新琐以及独占锁,需要加到一个区间值域的时候,再加上个间隙锁(或称范围锁),对不存在的数据也锁住,防止出现幻写。

备注:

以上2.1,2.2,2.3,2.4中描述的情况,跟MySQL所设置的事务隔离级别也有关系。

3.四种事务隔离模式

3.1 READ UNCOMMITED

SELECT的时候允许脏读,即SELECT会读取其他事务修改而还没有提交的数据。

3.2 READ COMMITED

SELECT的时候无法重复读,即同一个事务中两次执行同样的查询语句,若在第一次与第二次查询之间时间段,其他事务又刚好修改了其查询的数据且提交了,则两次读到的数据不一致。

3.3 REPEATABLE READ

SELECT的时候可以重复读,即同一个事务中两次执行同样的查询语句,得到的数据始终都是一致的。

3.4 SERIALIZABLE

与可重复读的唯一区别是,默认把普通的SELECT语句改成SELECT …. LOCK IN SHARE MODE。即为查询语句涉及到的数据加上共享琐,阻塞其他事务修改真实数据。

4. 验证事务与锁定示例

接下来,我们将以MySQL中的InnoDB引擎,解释其如何实现ACID特性,不同隔离级别下事务与事务之间的影响。示例表结构:

CREATE TABLE `account ` (

`ID` int(11) NOT NULL AUTO_INCREMENT,

`VACCOUNT_ID` varchar(32) NOT NULL,

`GMT_CREATE` datetime NOT NULL,

PRIMARY KEY (`ID`),

KEY `idx_VACCOUNT_PARAMETER_VACCOUNTID ` (`VACCOUNT_ID`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

然后向表account中写入10W条创建日期分布合理的帐号数据,以方便测试之用。

tx_isolation:SET GLOBAL tx_isolation=’read-uncommitted’
ID事务1事务1输出事务2事务2输出
1START TRANSACTION;   
2SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
   START TRANSACTION; 
3  UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001; 
4  SELECT VACCOUNT_ID from account  where ID =1001;uncommitted
5SELECT VACCOUNT_ID from account  where ID =1001;uncommitted  
6  ROLLBACK; 
7SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
8COMMIT;   
tx_isolation:SET GLOBAL tx_isolation=’read-committed’
ID事务1事务1输出事务2事务2输出
1START TRANSACTION;   
2SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
3  START TRANSACTION; 
4  UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001; 
5  SELECT VACCOUNT_ID from account  where ID =1001;uncommitted
6SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
7  COMMIT; 
8SELECT VACCOUNT_ID from account  where ID =1001;uncommitted  
9COMMIT;   
tx_isolation:SET GLOBAL tx_isolation=’REPEATABLE-READ’
ID事务1事务1输出事务2事务2输出
1START TRANSACTION;   
2SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
3  START TRANSACTION; 
4  UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001; 
5  SELECT VACCOUNT_ID from account  where ID =1001;uncommitted
6SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
7  COMMIT; 
8SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
9COMMIT;   
tx_isolation:SET GLOBAL tx_isolation=’SERIALIZABLE’
ID事务1事务1输出事务2事务2输出
1START TRANSACTION;   
2SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
3  START TRANSACTION; 
4  UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001;STATE: Updating
5SELECT VACCOUNT_ID from account  where ID =1001;caimao101510  
   事务2超时 
6COMMIT;   
7START TRANSACTION;   
8UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001;   
9  START TRANSACTION; 
10  SELECT VACCOUNT_ID from account  where ID =1001;STATE:statistics
11  事务2超时 
12commit;   

tx_isolation:SET GLOBAL tx_isolation=’REPEATABLE-READ’
ID事务1事务1输出事务2事务2输出
1START TRANSACTION;   
2select max(ID) FROM account;124999  
3  START TRANSACTION; 
4UPDATE account set gmt_create=date_add(gmt_create,interval +1 day) WHERE ID >=124999;   
5  insert into account(VACCOUNT_ID,gmt_create) values(‘eugene’,now());STATE:update
6  事务2超时 
7  START TRANSACTION; 
8  SELECT * FROM account WHERE ID =124998;2007-10-20 13:47
9  UPDATE account set gmt_create=date_add(gmt_create,interval +1 day) WHERE ID =124998;执行成功
10  SELECT * FROM account WHERE ID =124998;2007-10-21 13:47
11COMMIT;   
12  COMMIT; 
     
1START TRANSACTION;   
2UPDATE account set gmt_create=date_add(gmt_create,interval -1 day) WHERE gmt_create >’2009-07-01′;   
3  START TRANSACTION; 
4  SELECT * FROM account WHERE gmt_create>’2009-07-10′ LIMIT 1;2009-10-2 13:47
5SELECT * FROM account WHERE gmt_create>’2009-07-10′ LIMIT 1;2009-10-1 13:47 STATE:update
6  insert into account(VACCOUNT_ID,gmt_create) values(‘gmt_create_test’,now()); 
7  事务2超时 
8COMMIT;   
9  SELECT * FROM account WHERE gmt_create>’2009-07-10′ LIMIT 1;2009-10-1 13:47
无索引条件更新事务
1START TRANSACTION;   
 UPDATE account set gmt_create=date_add(gmt_create,interval -1 day) WHERE gmt_create >’2009-07-01′ AND gmt_create <’2009-07-10′;   
   START TRANSACTION; 
   insert into account(VACCOUNT_ID,gmt_create) values(‘gmt_create_interval’,now()); 
   事务2超时 
  COMMIT;  
高效低功耗设计:PMOS电子开关在墨水屏与ADC采样电路中的创新应用 本文深入探讨了PMOS电子开关在低功耗设计中的创新应用,特别是在墨水屏和ADC采样电路中的关键作用。通过详细分析PMOS的导通机制和近乎零静态功耗特性,展示了其在待机低功耗场景下的显著优势,并提供了实用的电路设计技巧和元器件选型建议,帮助工程师实现极致的功耗优化。 阅读详情

相关推荐

记一次从零到getshell的渗透历程

0x00 前期 拿到测试范围清单后,首先用脚本获取了下各个子站的标题,基本都是XXX管理系统。浏览器查看后,各个子站也大同小异,纯登录系统,带验证码。这些系统基本都是jsp写的,逮到了两个没有验证码的小宝贝,一番暴力破解,小宝贝对我说:别爱我,没结果。又看到了两个站返回的Set-Cookie头:rememberMe=deleteMe; 很明显,这是Apache Shiro。打了一波exp,没有反应,放弃。搞了三天啥都没搞出来,和女朋友出去玩散散心,还是很高兴。 0x01 初显进展 测试范围内有六个门户

CanMeng'Blog - 一个WEB安全渗透的技术爱好者 3968

mysql 事务涉及锁吗_MySQL-锁机制和事务

测试:4.5、innodb_locks_unsafe_for_binloginnodb_locks_unsafe_for_binlog参数用来控制innodb中是否允许间隔锁,默认是OFF代表允许间隔锁,设置成ON则代表不使用间隔锁,只是使用行级锁测试:五、InnoDB事务隔离级别5.1、简介1)InnoDB存储引擎提供了四种事务隔离级别,分别是:READ UNCOMMITTED:读取未提交内容R...

weixin_30878051的博客 423

手把手教你用scRNA-seq和scTCR-seq分析CD8⁺ T细胞在免疫治疗中的动态变化

本文详细介绍了如何整合单细胞RNA测序(scRNA-seq)与单细胞TCR测序(scTCR-seq)技术,深入解析CD8⁺ T细胞在癌症免疫治疗中的动态变化。通过从数据预处理、细胞亚群鉴定到TCR克隆追踪的完整分析流程,揭示了T细胞的功能状态转变与克隆演化规律,为理解免疫应答机制和开发精准治疗策略提供了关键方法学指导。

p8q9r0的博客 566

MySQL开启事务的sql块的写法!

<br />DELIMITER $$<br />use test$$<br />drop procedure if exists test.t1$$<br />use `test` $$<br />create procedure test.t1()<br />begin<br />    drop table if exists t1;<br />    create table test.t1 (c1 int)<br />    ENGINE = InnoDB;<br />    <br />     

青青的杉树湾 2万+

Gitee自动创建PR之——评审模式

一 创建PR的常规操作 本地更新主干(一般为master分支),基于主干新建一个分支并(如Dev分支)切换; 进行新的需求开发; 将这个分支推送到远端; 打开 Gitee ,进入创建 Pull Request 界面; 选定目标分支(及我们需要合并到主干分支的分支,一般即为我们的开发分支); 填写 Title 以及 Description; 点击提交 Pull Request。 二 更快的常见PR的方式— — 评审模式 现在 Gitee.

calm_encode的博客 2987

逆向Shopee签名机制:从参数分析到稳定采集方案

本文深入解析了Shopee签名机制的逆向过程,从参数分析到稳定采集方案的实现。通过抓包定位关键参数`sap-ri`和`x-sap-sec`,还原了签名生成算法,并提供了Python实现代码。文章还分享了反反爬策略、性能优化技巧及长期维护建议,帮助开发者构建稳定的Shopee数据采集方案。

weixin_27722377的博客 672

Innodb中的事务和锁以及MVCC

蚂蚁金服面试,主要问了一些jvm和mysql的知识,有些问题回答的模棱两可,再次总结一下。mysql因为其插件式存储引擎以及其较小的体积成为了许多应用中数据库的首选,Innodb引擎支持事务,外键并且支持行锁,被广泛的应用于OLTP业务中。1.mysql的体系架构 上图是mysql的总体架构,可以看到插件式的存储引擎只是mysql的一个组件而已,引擎是基于表的,而并非是基于数据库的。 有一个

jingwen的博客 4359

OpenMythos深度解析

本文深入解析了kyegomez/OpenMythos项目如何从第一性原理重建Claude Mythos的核心架构。该项目并非直接复制Claude,而是基于公开论文和实验结果推测其可能的设计理念,构建了包含多模态注意力、深度推理引擎、知识检索模块等六大核心组件的模块化架构。重点剖析了分组查询注意力(GQA)的实现细节,展示了KV头扩展等关键技术。该项目已成为大模型开源社区最受关注的研究之一,为理解Claude的架构思想提供了有价值的参考。

Crown_22的博客 518

Mysql InnoDB 事务与锁

Mysql InnoDB 事务与锁 事务 锁 隔离级别 (并发控制&数据安全) MySQL 存储引擎: MyISAM - 5.0之前默认的 数据库存储引擎, 最为常用,较高的插入,查询速度,不支持事务 InnoDB 事务型数据库的 首选, 支持 ACID事务安全, 支持行级...

唐僧的专栏 791

解决此平台不支持虚拟化的 Intel VT-x/EPT故障问题

当我们在VMware Workstation虚拟机上【启用】虚拟系统(如:Windows10)所在的虚【拟机设置】【处理器】【虚拟化引擎】下面的【虚拟化 Intel VT-x/EPT 或AMD-V/RVI(V)】内容后,在启动虚拟系统时,虚拟系统无法启动,且弹出【此平台不支持虚拟化的 Intel VT-x/EPT。不使用虚拟化的 Intel VT-x/EPT,是否继续】窗口

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3200

谈一谈mysql innoDB的事务与锁

文章目录理解事务事务的四个特性及innoDB的实现内存、文件与磁盘磁盘缓存——缓冲池WAL日志回滚日志二进制日志重做日志隔离级别四种隔离级别不同隔离性存在的问题脏读不可重复读幻读读写、写写冲突当前读快照读多版本并发控制MVCCmysql隔离级别实现加锁不加锁 理解事务 事务的四个特性及innoDB的实现 内存、文件与磁盘 磁盘缓存——缓冲池 WAL 日志 回滚日志 二进制日志 重做日志 隔离级别 四种隔离级别 不同隔离性存在的问题 脏读 不可重复读 幻读 读写、写写冲突 当前读 快照读 多版本并发控制MVC

qq_44793993的博客 1076

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

data+scenario+science+insight 3926

探索MySQL InnoDB:事务、日志与锁的奥秘

本文深入探讨了 MySQL InnoDB 存储引擎中的事务管理、日志机制和锁的使用。从事务的基本概念和 ACID 特性出发,详细介绍了 InnoDB 支持的四种隔离级别及其应用场景。进一步阐释了多版本并发控制(MVCC)机制如何通过 Read View 实现一致性非锁定读,并分析了不同隔离级别下的幻读问题及解决方案。此外,文章详细解读了 InnoDB 的锁机制,包括共享锁、排他锁、意向锁、记录锁、间隙锁和临键锁的工作原理和适用场景。同时,深入剖析了 undolog 和 redolog 的功能、工作原理及其在

m0_73359068的博客 1168

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mysql 事务 锁 例子_MySQL InnoDB之事务与锁详解

引题:为何引入事务?1>.数据完整性2>.数据安全性3>.充分利用系统资源,提高系统并发处理的能力1.事务的特征事务具有四个特性:原子性(Atomiocity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这四个特性简称ACID特性。1.1原子性事务是数据库的逻辑工作单位,事务中包括的所有操作要么都做,要么都不做。1.2一致性事...

weixin_31310913的博客 127

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mysql 事务 innodb 锁表_MySQL性能优化之Innodb事务系统,值得收藏

概述今天主要分享下Innodb事务系统的一些优化相关,以下基于mysql 5.7。Innodb中的事务、视图、多版本1、事务在Innodb中,每次开启一个事务时,都会为该session分配一个事务对象。而为了对全局所有的事务进行控制和协调,有一个全局对象trx_sys,对trx_sys相关成员的操作需要trx_sys->mutex锁。mysql数据库遵循的是两段锁协议,将事务分成两个阶段,加...

weixin_35529551的博客 377

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

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

Mysql中innodb事务,锁的理解

MVCC 通俗理解,mysql innodb 锁,悲观锁,乐观锁,读写锁

weixin_39361456的博客 447

mysql innodb 的锁、事务、添加索引、死锁

Mysql InnoDB引擎的行锁和表锁

qq_35916684的博客 324

【MySQL】InnoDB 锁、事务、MVCC

行级锁不一定会增加开销。InnoDB存储引擎不需要锁升级,因为一个锁和多个锁的开销是相同的。位图存储,所以相同InnoDB提供一致性非锁定读、行级锁支持。lock与latchlatch一般被称为闩锁,是轻量级锁,要求锁定时间非常短,分为mutex互斥量、rwlock读写锁,保证并发线程操作临界资源的正确性,通常无死锁检测机制。我理解是对数据库本身各种线程请求资源加的锁lock的对象是事务,锁定数据库中的对象,如表、页、行,有死锁机制。locklatch对象事务线程保护数据库内容。

dreambyday 766

MySQL|从事务到InnoDB锁深度剖析

听过Mysql的人可能都知道,MySQL的存储引擎有很多,如MyISAM,InnoDB,MEMORY,ARCHIVE等。但是只有InnoDB才支持事务,今天我们就来一起探讨一下InnoDB存储引擎。 1.什么是事务? 事务是数据库操作的最小执行单元(不可再分割),是作为单个逻辑单元执行的一系列操作。 2.事务的4大特性 原子性:最小的工作单元,整个工作单元要么一起提交成功,要么全部失效回滚。 一致性:事务中操作的数据改变...

weixin_43407686的博客 182

剖析MySQL InnoDB引擎的行锁表锁,怎样利用锁解决事务并发问题

在正式讲解各种锁之前,先来预习事务的四种隔离级别,因为MySQL事务隔离级别不同,所用到的锁也有差别。各种事务隔离级别可以对应解决不同类型的事务并发带来的问题,事务隔离级别越高,可以解决的事务并发问题越多,同时性能事务性能也就越低,所以并非事务隔离级别越高越好。 一、事务并发带来的问题 1、脏读:脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效...

wangpf2011的博客 550

MySQL Innodb中的事务隔离级别和锁的关系15

前言 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到

2401_89488159的博客 1021

MySQL Innodb中的事务隔离级别和锁的关系5

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。

STC91s的博客 863

MySQL Innodb中的事务隔离级别和锁的关系1

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。

xingyi51的博客 844

MySQL-InnoDB锁、事务与MVCC

锁的获取和释放单位是事务锁在SQL执行时获取。锁在事务结束时(COMMIT/ROLLBACK)释放。这解释了为什么长事务是性能杀手。InnoDB锁的核心设计原则行锁为主支持高并发。索引加锁:锁加在索引上,没有索引会锁表。粒度平衡:在锁开销和并发度间取得平衡。隔离级别的影响READ COMMITTED:只有记录锁(Record Lock),无间隙锁(Gap Lock)。REPEATABLE READ:默认使用 Next-Key Lock(记录锁+间隙锁)。

fupinghaohao的博客 957

MySQL Innodb中的事务隔离级别和锁的关系2

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。

2402_89510315的博客 879
上一篇: 解读MySQL事务的隔离级别和日志登记模式选择技巧
下一篇: 生产环境搭建MySQL复制的教程
windex2000
博客等级 码龄17年 2粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值