【MySQL】一文搞懂 MySQL 中的事务

news2025/1/18 6:51:53

文章目录

  • 0. 前提概要
  • 1. 什么是事务?
  • 2. 事务的四大特性
  • 3. 并发存在的问题
  • 4. SQL 标准定义的事务隔离级别
  • 5. SpringBoot 解决事务
    • 5.1 编程式事务
    • 5.2 声明式事务


在这里插入图片描述

0. 前提概要

谈事务,一般就是说数据库事务。本篇文章以 MySQL 为例谈一谈事务。

MySQL 的 Indndb 引擎和 bdb 引擎支持事务。MySQL 的myisam ,memory 等存储引擎是不支持事务的。

自 MySQL5.5之后,默认的存储引擎是Innodb。


1. 什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

比如说我给你2块钱,你给我个外婆菜包子。这两个动作的执行结果是一致的,要么都成功,要么都失败。

不能说我给了你两块钱,你给我包子的动作却执行失败了,那这两个动作就不满足事务(那我早点吃什么~)。


2. 事务的四大特性

事务具体四大特性,也就是经常说的ACID ,常用的MySQL、SqlServer、Orancle都具备这四大特性。

  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作用;
  2. ⼀致性(Consistency): 执行事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;
  3. 隔离性(Isolation): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务之间数据是独立的;
  4. 持久性(Durability): ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
MySQL 中的 ACID 实现原理:
原子性:undolog(记录事务开始前的老版本数据,可以保证原子操作,回滚,实现MVCC版本链)
隔离性:读写锁 、MVCC
持久性:redo log(记录事务开启后对数据的修改,可用于crash-safe)


3. 并发存在的问题

  1. 脏读:读到未提交的数
  2. 不可重复读:一个事务下,两次读取数据不一致(侧重内容数据的修改)
  3. 幻读:事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读(侧重新增或删除,插入数据读到多了一行)
不可重复读:破坏了一致性,update 和 delete
幻读:破坏了一致性 insert

不可重复读和幻读的区别
● 不可重复读的重点是内容修改或者记录减少比如多次读取一条记录发现其中某些记录的值被修改;
● 幻读的重点在于记录新增比如多次执行同一条查询语句(DQL)时,发现查到的记录增加了。
幻读其实可以看作是不可重复读的一种特殊情况,
单独把区分幻读的原因主要是解决幻读和不可重复读的方案不一样。

举个例子:执行 delete 和 update 操作的时候,可以直接对记录加锁,保证事务安全。
而执行 insert 操作的时候,由于记录锁(Record Lock)只能锁住已经存在的记录,为了避免插入新记录,
需要依赖间隙锁(Gap Lock)。
也就是说执行 insert 操作的时候需要依赖 Next-Key Lock(Record Lock+Gap Lock) 
进行加锁来保证不出现幻读。


4. SQL 标准定义的事务隔离级别

隔离级别原理及解决问题分析:

  1. 读未提交:原理:直接读取数据,不能解决任何并发问题

  2. 读已提交:读操作不加锁,写操作加排他锁,解决了脏读。原理:利用MVCC实现,每一句语句执行前都会生成Read View(一致性视图)

  3. 可重复读:MVCC实现,只有事务开始时会创建Read View,之后事务里的其他查询都用这个Read View。解决了脏读、不可重复读,快照读(普通查询,读取历史数据)使用MVCC解决了幻读,当前读(读取最新提交数据)通过间隙锁解决幻读(lock in share mode、for update、update、detete、insert),间隙锁在可重复读下才生效。(默认隔离级别)

  4. 可串行化:原理:使用锁,读加共享锁,写加排他锁,串行执行

总结:
读已提交和可重复读实现原理就是MVCC Read View不同的生成时机。
可重复读只在事务开始时生成一个Read View,之后都用的这个;读已提交每次执行前都会生成Read View。

MySQL 在 InnoDB下是默认可重复读的隔离级别,加上 MVCC机制 解决了脏读、不可重复读、幻读的问题。



5. SpringBoot 解决事务

5.1 编程式事务

Spring 提供一个接口(PlatfromTransactionManager) 代表事务管理器,为不同框架提供了不同的实现类。

在这里插入图片描述

Mybatis 框架 事务的实现类是 DataSourceTransactonManager 

使用案例

@Autowired
private TransactionDefinition transactionDefinition;
@Autowired
private DataSourceTransactionManager transactionManager;

//  开启事务
TransactionStatus transactionStatus
        = transactionManager.getTransaction(transactionDefinition);

try {
    //	业务操作
    // ...
    //  提交事务
    transactionManager.commit(transactionStatus);
} catch (Exception e) {
    //  回滚事务
    transactionManager.rollback(transactionStatus);
    log.error("...");
}


5.2 声明式事务

Spring 需要手动开启事务, SpringBoot 默认开启了 不用手动开启。
具体方法上加事务注解就行了。但是 注意事务失效情况。



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超大规模数据库集群保稳系列之三:美团数据库容灾体系建设实践

本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》,系超大规模数据库集群保稳系列(内含4个议题的PPT及视频)的第3篇文章。 本文重点介绍了美团数据库的容灾体系建设实践,主要内容包括业务架构、数据库容灾平…

ICASSP 2023 | 解密实时通话中基于 AI 的一些语音增强技术

‍ 动手点关注 干货不迷路 背景介绍 实时音视频通信 RTC 在成为人们生活和工作中不可或缺的基础设施后,其中所涉及的各类技术也在不断演进以应对处理复杂多场景问题,比如音频场景中,如何在多设备、多人、多噪音场景下,为用户提供听…

【ElementUI 表单校验】一个 el-form-item 下多个表单校验(循环校验)

前端项目开发中,表单的应用是必不可少的,不管使用的原生、还是框架如:ElementUI、Ant Design Vue 等。基本的表单应用比较简单,按照文档中的描述使用即可。 官网地址 如下图: 使用 ElementUI 中的表单代码如下&…

国产数据库|GBase 8s 安装卸载与简单使用

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT) 如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA) 大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看国产数据库|GBase 8s 安装卸载与简单使用&#…

POSTGRESQL SERVERLESS 是POSTGRESQL 数据库的未来 (译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

Web3能拯救失落的互联网人吗?

随着互联网的发展,人们逐渐感受到了中心化互联网的局限性和不足之处。 Web3 技术作为一种去中心化的互联网形态,为用户提供了更安全、透明和个人主权的在线体验。本文将探讨 Web3 是否能拯救那些在中心化互联网中感到失落的人们,让我们一起探…

LVS负载均衡——DR模式

一、LVS-DR模式 LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。 LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用节点 Director Server 与 Real Serve…

软考A计划-电子商务设计师-模拟试题卷二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【报告】当“无线通信”遇到“图神经网络”——简单理解

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 课程报告,随便做的,仅供参考~ B站视频:https://www.bilibili.com/video/BV1tM4y1v7t4/ 以下格式默认为:先放图,再放文字 前面的同学介绍了传统方法和经典…

$1$驱动开发

目录 1.驱动大纲: 2.单片机开发属于嵌入式开发吗? 3.RAM裸机代码和驱动有什么区别? 4.Linux系统的组成 5.宏内核、微内核 6.驱动移植 1.驱动大纲: (1)内核模块 (2)字符设备驱…

ArchGuard Co-mate:一次关于大语言模型与架构治理、架构设计的探索

在过去的几个月里,为了探索了 LLM 结合 SDLC、BizDevOps 的可能性,我们(Thoughtworks 开源社区)创建了 ClickPrompt、 AutoDev、DevTi 等一系列的开源项目。从个人的经验来看,未来越来越多的应用将围绕于 LLMCore 设计…

400万总奖金!打一场大厂算法赛事

Datawhale赛事 主办:科大讯飞,伙伴:Datawhale 5月6日,伴随科大讯飞星火认知大模型的发布,2023年度 iFLYTEK A.I. 开发者大赛也正式开启。本届大赛的总奖金池超400万元,除此外还将进一步开放海量数据与核心…

如何使用ArcGIS制作三维地形图

ArcGIS作为专业的GIS软件,不仅可以制作二维地图,制作三维地图也是不在话下,通常我们使用ArcScene来制作三维地图,这里为大家介绍一下制作三维地图的方法,希望能对你有所帮助。 预处理数据 将准备好的矩形面、矩形线和…

Kibana:使用 Kibana 自带数据进行可视化(一)

在今天的练习中,我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack,你可以参考如下的视频来开启 Elastic Stack 并进行下面的练习。你可以开通阿里云检…

接着首发!2023全国1卷数学压轴题解析

早点关注我,精彩不错过! 压轴题原题如下: 以下是压轴题速解,上次突出一个细,这次,自己挑战了一把快! 去年偶然得闲,在高考当天晚上陷入了少年的回忆,重做了一把高考数学压…

“站在后天看明天”:华为给金融广厦架起数字栋梁

在中国古建筑中,有个重要概念,叫做“栋梁”。其中“栋”是指房屋的东西向正梁,起到承担房屋荷载的作用;“梁”则是支撑楼板和其他承重结构的南北向竖梁,起到构筑受重面,支撑屋顶飞檐斗拱的作用。 精彩绝伦、…

如何安装和使用 Hugging Face Unity API

Hugging Face Unity API 提供了一个简单易用的接口,允许开发者在自己的 Unity 项目中方便地访问和使用 Hugging Face AI 模型,已集成到 Hugging Face Inference API 中。本文将详细介绍 API 的安装步骤和使用方法。 安装步骤 打开您的 Unity 项目导航至菜…

2核4G服务器阿里云和腾讯云性能测试对比

阿里云轻量应用服务器2核4G4M带宽优惠价297.98元12个月,腾讯云轻量2核4G5M服务器168元一年,628元3年,2核4G轻量应用服务器阿里云和腾讯云怎么选择?哪个性能比较好?阿腾云分享轻量应用服务器2核4G配置阿里云和腾讯云价格…

3A(3000mA)输出电流比例阀控制器

0.5A(500mA)、0.8A(800mA)、1A(1000mA)、1.5A(1500mA)、2A(2000mA)、2.5A(2500mA)、3A(3000mA)、3.2A(3200mA)等电流输出控制比例阀放大器是用于控制液压系统中的比例阀线圈驱动阀芯运动。它主要由阀体、驱动线圈和放大器。 比例阀是控制方向、流量或压力的元件,它的…

chatgpt赋能python:Python怎么1加1等于2

Python怎么1加1等于2 Python是一种高级编程语言,通常用于快速开发应用程序,处理数据和进行科学计算。Python是一门易于学习的语言,学习它的基础非常简单。 介绍 Python在计算机科学领域已经有超过20年的历史,它在很多领域都有广…