MySQL----事务

Spring事务和Mysql事务总结 目录spring事务与数据库事务与锁之间的关系五分钟搞清楚MySQL事务隔离级别//dao spring事务与数据库事务与锁之间的关系 一直没搞清楚spring事务与数据库事务与锁之间的关系,也许是因为这个体系非常庞大,确实比较凌乱。 后来从一个博客上看到:spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数... 阅读详情

一.事务四大特性 ACID

原子性(Atomicity): 一个事务中的操作要么全部成功要么全部失败;由undo log(回滚日志)实现

持久性(Durability): 事务执行完毕后,对数据的修改是永久的;由redo log(重做日志)实现

隔离性(Isolation): 事务在并发环境下各自独立运行不受外部并发操作影响;由MVCC(多版本并发控制)与锁机制共同实现的。MVCC解决读-写冲突,锁机制解决写-写冲突

一致性(Consistency): 事务执行后,数据库必须从一个合法的状态转移到另一个合法的状态,始终满足预定义的规则(如主键唯一、外键约束、业务逻辑等)。若违反规则,事务会回滚。 确保数据永远处于合法状态;由持久性+原子性+隔离性保证,即由redo log + undo log + MVCC + 锁共同实现。

二.并发事务三大问题

脏读: 事务A读取到了事务B修改后未提交的数据,且事务B回滚;假设有事务A与事务B同时进行,事务A先修改了数据但暂时未提交,此时事务B直接读取到了事务A修改后未提交的数据,但事务A在后续执行中发生了回滚操作,数据变更为了未修改前的旧数据,那么事务B就读取到了无效的错误数据,即为脏读。

不可重复读: 在一个事务内多次读取同一个数据,但前后读取到的数据不一致;假设有事务A与事务B同时进行,事务A先读取了一次数据,然后事务B修改了数据并提交,此时事务A再次读取数据就读取到了新数据,前后不一致即为不可重复读。

幻读: 在一个事务内多次查询符合条件的数据,但前后查询到的符合条件的数据数量不同;假设有事务A与事务B同时进行,事务A先查询符合条件的数据,此时事务B又插入了数量不等的符合事务A查询条件的数据,此时事务A再次查询凭空多出了符合条件的数据,即为幻读。

三.MVCC(多版本并发控制)

当前读: 读取数据的最新版本,且读取时保证其他并发事务不能修改当前记录,会对读取到的记录加锁,不同的隔离级别以及不同的语句加的锁不同。

快照读: 读取数据的历史可见版本(版本访问权限由RedView控制),不加锁是非阻塞读。

记录中的三个隐藏字段:

ReadView(读视图): 通过记录一系列未提交事务的id,控制快照读时可访问的数据版本

trx_id: 当前undolog创建者id

trx_id = readview创建者事务id,说明当前记录就是该事务修改,该版本数据可以访问

trx_id<最小活跃事务id,说明修改该数据的事务已经提交,该版本数据可以访问

trx_id>=max_trx_id(预分配事务id),说明数据是在视图创建后才被修改的,不能访问该版本数据

最小活跃id<=最后一次数据修改者id<预分配事务id 说明读视图创建时,修改数据的事 务已经开启,能否访问取决于修改数据的事务是否提交,若修改数据事务id在m_ids(当 前活跃事务id集合中)中,说明查询语句执行时,修改数据事务未提交不可访问该版本数 据,若修改数据事务id不在m_ids活跃事务id中 说明查询操作开始时修改数据事务已提交 可以访问该版本数据

四.事务隔离级别

读未提交(Read uncommitted): 无任何限制手段,直接读取最新的数据,一个事务还未提交,它做的变更就能被其他事务感知到;问题最多,存在脏读、不可重复读、幻读的问题。

读已提交(Read committed): 一个事务提交之后,它做的变更才能被其他事务感知到;解决了脏读问题,但仍然存在不可重复读与幻读问题。读已提交隔离级别下的普通select语句都是快照读,且每次查询前都会生成新的ReadView,由于一系列事务id的变化,相同的读操作可读取的数据版本可能会发生改变,因此解决了脏读问题,并未解决不可重复读与幻读。

在 READ COMMITTED 隔离级别下,当前读的加锁行为如下:

操作类型

锁类型

锁范围

说明

SELECT ... FOR UPDATE

排他锁(X)

仅锁定匹配的记录

不加间隙锁(Gap Lock),其他事务可以插入新记录(可能幻读)。

SELECT ... FOR SHARE

共享锁(S)

仅锁定匹配的记录

其他事务可加共享锁,但不能加排他锁(不加间隙锁)。

UPDATE

/DELETE

排他锁(X)

仅锁定匹配的记录

隐式先执行当前读(类似 SELECT ... FOR UPDATE

),再修改数据。

仅加记录锁,不加间隙锁,完全无法避免幻读

可重复读(repeatable read): 一个事务执行过程中,读到的数据和其开启时是一致的,一直保持不变;解决了不可重复读问题并解决了大部分幻读问题。可重复读隔离级别下普通select语句是快照读,且只在该事务开启后的第一次快照读时生成ReadView,能读取到的数据始终是不变的,解决了不可重复读问题。

在REPEATABLE READ下,当前读操作会加以下锁:

操作类型

锁类型

锁范围

SELECT ... FOR UPDATE

排他锁(X锁)

临键锁(Next-Key Lock)

SELECT ... FOR SHARE

共享锁(S锁)

临键锁(Next-Key Lock)

UPDATE

排他锁(X锁)

临键锁(Next-Key Lock)

DELETE

排他锁(X锁)

临键锁(Next-Key Lock)

在可重复读隔离级别下,快照读时由于只生成了一次ReadView,整个事务生命周期内可读取到的数据都是一样的,因此可重复读隔离级别时在快照读的情况下解决了不可重复读与所有幻读问题(如果在事务生命周期内仅使用快照读)。而当前读情况下通过加临建锁(行锁+间隙锁)解决了大部分幻读问题。

幻读仍会发生的场景:

快照读+隐式当前读(Delete/Update/Inseret)+快照读幻读:事务A先查询某条不存在的记录没查到(快照读),此时事务B向数据库中插入了该条不存在的数据并提交,那么此时如果事务A还是执行正常的快照读的话仍然是不会出现幻读问题的,但如果事务A在未查到数据的情况下直接更新事务B刚刚插入的数据(当前读),那么该条被插入记录的隐藏字段DB_TRX_ID就会变成事务A的id,该行记录就对事务A的快照读也可见了。

快照读+显示当前读+当前读幻读: 事务A先查询某条数据(快照读),此时事务B修改了该数据并提交,此时事务A执行显示当前读(SELECT ... FOR UPDATE/SELECT ... FOR SHARE)直接读取到了被修改后的数据导致幻读。

串行化: 完全解决了脏读,不可重复读,幻读所有问题,性能最差,当两个事务出现并发冲突时会阻塞或终止其中一个事务。所有Select默认都是当前读,加锁。

Spring事务和MySQL事务详解面试 文章目录数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTEDSpring事务的隔离级别Spring 阅读详情

相关推荐

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2004

【MySQL】事务

本篇文章全面解析了数据库事务的概念、作用及其核心操作。事务作为数据库管理的基本单位,确保了数据操作的一致性、完整性和可靠性。文章详细探讨了事务的定义、版本支持、提交方式以及常见操作,并通过一系列实验演示了事务的回滚机制及在不同情况下的数据表现。同时,深入剖析了事务隔离级别的概念、分类及作用,帮助理解不同隔离级别对数据库一致性和并发性能的影响。

是阿建吖! 5499

7-15 估值一亿的AI核心代码

函数封装,含一个字符串中的所有的某个字串全部替换成另一个的函数,还有判断是否独立的函数以上图片来自新浪微博。!

weixin_73529240的博客 601

MySQL——事务

MySQL、事务

2303_78442132的博客 3948

Vscode + QT + CMake:高效开发环境搭建全攻略

本文详细介绍了如何搭建Vscode+QT+CMake高效开发环境,涵盖环境安装、配置优化及项目创建全流程。通过整合Vscode的轻量化编辑、QT的跨平台GUI开发以及CMake的现代构建管理,该组合特别适合大型QT项目和跨平台开发团队,能显著提升开发效率。

weixin_30338481的博客 504

MATLAB2022b安装

图文并茂,手把手教会你怎么安装MATLAB2022b

1万+

MySQL事务

MySQL事务 一、MySQL事务的概念二、事务的ACID特点1、原子性2、一致性3、隔离性4、持久性 三、事务之间的相互影响四、MySQL及事务隔离级别1、查询全局事务隔离级别2、查询会话事务隔离级别3、设置全局事务隔离级别4、设置会话事务隔离级别 五、事务控制语句1、测试提交事务2、测试回滚事务3、测试多点回滚4、使用 set 设置控制事务 一、MySQL事务的概念 ● 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作..

Smile x 3818

2024最新版:MacOS Sonoma系统下CocoaPods安装全攻略(解决Ruby版本冲突)

本文详细介绍了在MacOS Sonoma系统下安装CocoaPods的全过程,重点解决Ruby版本冲突问题。通过HomeBrew安装最新Ruby版本,配置环境变量,并正确安装CocoaPods,帮助iOS开发者顺利管理项目依赖。文章还提供了常见问题的解决方案和优化配置建议,确保开发环境的稳定性和高效性。

lll78的博客 1042

MYSQL事务

事务(Transaction)是一组数据库操作的集合,这些操作要么全部执行成功,要么全部不执行。在MySQL中,事务确保了一组数据库操作的原子性,一致性,隔离性和持久性,简称ACID属性。原子性 (Atomicity):原子性指事务中的所有操作要么全部执行成功,要么全部不执行。即事务不可分割,事务中的操作要么全部完成,要么由于某种原因全部回滚。一致性 (Consistency):一致性确保事务开始前和结束后,数据库状态保持一致。事务执行过程中虽然数据库状态可能临时不一致,但最终状态必须符合预期约束。

eternal__day的博客 1170

基于Abaqus的横向各向同性线弹性理想塑性材料模型的umat子程序实现——以Fortran为例,带您揭秘弹性塑性模型编程之道

通过以上步骤,我们已经在Abaqus中使用Fortran实现了横向各向同性线弹性理想塑性材料模型的umat子程序。在实际应用中,我们需要根据具体的材料特性和加载条件来调整模型参数和计算过程。尽管我在这篇文章中尽力提供了详细的教程,但由于我自身的知识限制和经验不足,可能会有误解或错误。我希望大家在学习过程中能多思考,多实践,多交流,以更好地理解和掌握这个主题。

qq_38334677的博客 1690

【四足机器人项目实战】波士顿spot四足机器人机工程设计及实现分析

主要介绍了波士顿spot机器人的发展历史、四足机器人的硬件系统及电机执行器组成包括硬件系统、关节电机执行器,机载传感器机处理器及电气连接等。概述了四足机器人规划控制、感知、定位及局部地图的相关算法方向。

qq_35635374的博客 4999

[MySQL]事务

事务是数据库中将一组SQL语句打包执行的机制,确保要么全部成功要么全部失败。具有ACID特性:原子性(整体执行)、一致性(数据正确)、隔离性(事务间独立)和持久性(持久保存)。

z141042的博客 1572

Agent Harness Engineering: AI Agent 执行管控与安全沙箱 原理与最佳实践

我们正站在计算范式转移的历史节点上。2024-2026 年间,AI 系统从被动的内容生成器(Generative AI)演变为主动的行动执行者(Agentic AI)。这一转变的根本特征是:根据 2026 年初的行业数据:然而,能力的提升伴随着风险的指数级增长。2024-2026 年间发生的多起标志性安全事件揭示了 Agent 系统的脆弱性:案例 1:Slack AI 数据外泄事件(2024 年 8 月)案例 2:制造业供应链攻击(2026 年 Q3)案例 3:Arup 深度诈骗案(2026 年 9 月)这

AI天才研究院 1670

MySQL的事务与Spring的事务

MySQL系列文章总目录:关系型/非关系型【数据库】知识脉络 为什么MySQL要有事务? 一个数据库,一个表,十个人来查看,十个人来写数据,再来十个人删除数据。这一番操作下来,会有哪些可能性? 会有哪些可能性? 假如黄蓉郭靖分隔两地,又没有电话沟通(书信需要传一个月),恰巧又使用了没事物的银行数据库。 0. 两人都到银行先看了一眼存款:500银子! 黄蓉再存500银子,心想有1000银子,郭靖在天涯那边正取200银子,黄蓉存完一看,怎么...

披甲上战场的博客 2569

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL事务与Spring事务的关系

MySQL事务是数据库层面的原生事务机制,而Spring事务是应用层基于MySQL事务(或其他数据库事务)构建的声明式/编程式事务抽象,也就是说,Sprnig事务是 数据库事务在 Java框架层面的封装和增强,本质上还是依赖数据库的事务机制。 MySQL的事务模型:这篇文章的最后会说明使用Spring事务的3种方式(本质上就两种,声明式和编程式)下面给出一个例子,使用的是 Spring的声明式事务(@Transactional) 3. 两者关系详解 3.1 层级关系 3.2 Spring对MySQL事务

fupinghaohao的博客 1016

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MYSQL事务机制

十分钟吃透MySQL的事务机制,深入理解不同事务隔离级别的实现原理

weixin_45739173的博客 1670

蓝牙模块HM-10手册

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

mysql怎样开启事务_MySQL 如何使用事务

基础知识事务是指对一组 SQL 语句进行一个原子化的操作,即如果这一组 SQL 语句中有一条发生错误,那么其他的同组 SQL 就都不会被执行。你可以把它当作一个测试,当你执行完一组 SQL 语句后,可以查看一下结果是否正确,如果正确后可以选择提交,如果不正确则可以进行回滚,恢复到原本的状态。在 MySQL 中,所有的操作默认都是自动进行提交,当开启事务后则变为手动提交。基本使用单独开启单独开启是指...

weixin_30744725的博客 6268

MySQL 事务

一篇文章让你看懂什么是 MySQL 事务

Demo_Null 3678

MySQL事务基础

事务是数据库区别于文件系统的重要特性之一,当有了事务就会让数据库始终保持一致性,同时还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失ACID是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是目的。数据库事务,其实就是数据库设计者为了方便起见,把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务。

YouPromise的博客 992

MySQL 之事务详解

事务是保证数据一致性的重要机制,就像一个“安全盒子”,保护着你的数据操作。理解ACID四大特性是掌握事务的关键。使用 START TRANSACTION 、 COMMIT 和 ROLLBACK 语句来控制事务。选择合适的隔离级别来避免并发问题。了解常见的并发问题,并学会如何避免。希望这篇通俗易懂的指南能够帮助你解开MySQL事务的迷雾,并在实际应用中游刃有余!

weixin_64178283的博客 1645
上一篇: 图论----2.腐烂的橘子
下一篇: 图论----3.课程表
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值