MySQL 事务(详细版)

news2025/4/26 2:25:03

目录

一、事务简介

1、事务的概念        

2、事务执行的案例

3、对于事务的理解

二、事务操作

(一)未控制事务

(二)控制事务一

(三)控制事务二

三、事务四大特性

四、并发事务问题

五、事务隔离级别

1、事务隔离级别的介绍        

2、操作事务隔离级别的语法

3、实例分析(串行化)


一、事务简介

1、事务的概念        

        事务是一组操作的集合它是一个不可分割的工作单位。

        当我们进行事务操作时,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

2、事务执行的案例

        就比如:张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。

        正常情况:转账这个操作,需要分为以下这么三步来完成,三步完成之后,张三减少1000,而李四增加1000,转账成功。

        异常情况:转账这个操作,也是分为以下这么三步来完成,在执行第三步是报错了,这样就导致张三减少1000块钱,而李四的金额没变,这样就造成了数据的不一致,就出现问题了。

        为了解决上述的问题,就需要通过数据的事务来完成。

        我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。

3、对于事务的理解

        默认情况下,每一条SQL语句都是一个事务。这条SQL语句一旦执行完成,事务就会自动提交,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

        事务一旦提交,表格就会有对应的变化。

        如果有一件事,例如上面的转账操作,必须三个步骤同时完成才可以,此时就需要将几条SQL语句作为一个事务,保证它们同时成功或同时失败不影响原来的数据。

        所以此时我们就要对事务进行控制,将几条SQL语句组合为一个事务。如果成功,就统一提交,如果失败,则避免影响数据库的内容。

二、事务操作

数据准备:

drop table if exists account;

create table account(
    id int primary key AUTO_INCREMENT comment 'ID',
    name varchar(10) comment '姓名',
    money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);
(一)未控制事务

1、测试正常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

        测试完毕之后检查数据的状态,可以看到数据操作前后是一致的。(总余额)

2、测试异常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- SQL语句中写中文必然报错
-- 但是在dataship中这条语句会被跳过,实际执行时,不会报错
出错了....
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

        我们把数据都恢复到2000, 然后再次一次性执行上述的SQL语句(出错了.... 这句话不符合SQL语法,执行就会报错),检查最终的数据情况,发现数据在操作前后不一致了(总余额)

(二)控制事务一

1、查看/设置事务提交方式

-- 查看事务的提交方式

select @@autocommit ;

-- 如果赋值为1,就是自动提交事务;

-- 如果赋值为0,就是手动提交事务;

-- MySQL中默认自动提交事务,所以要设置为手动。

set @@autocommit = 0 ;

2、提交事务

-- 手动提交的情况下,要执行了commit,事务才会提交,数据库中内容才会发生改变。

commit ;

3、回滚事务

-- 执行过程中,如果发生了异常,就去执行rollback回滚,撤回该事务内已执行的操作。

rollback ;

注意事项:

        上述的这种方式,我们是修改了事务的自动提交行为,把默认的自动提交修改为了手动提
,此时我们执行的DML语句都不会提交,需要手动的执行commit进行提交

        如果业务操作正常完成,事务需要提交,就执行commit指令;如果执行事务操作的过程中出现了异常,那就执行rollback指令回滚事务,保证数据库中数据的正确性与完整性

(三)控制事务二

1、开启事务

-- 手动开启事务,而不是修改事务的提交方式

start transaction ; 或 begin ;

2、提交事务

-- 如果事务执行成功,执行commit指令

commit ;

3、回滚事务

-- 如果事务执行失败,执行rollbakc指令

rollback ;

-- 开启事务
start transaction 

-- 1. 查询张三余额
select * from account where name = '张三';

-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';

-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

-- 如果正常执行完毕, 则提交事务
commit;

-- 如果执行过程中报错, 则回滚事务
-- 回滚事务之后就代表着当前事务已经结束了
rollback;

三、事务四大特性

1、原子性(Atomicity)

        事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

2、一致性(Consistency)

        事务完成时,必须使所有的数据都保持一致状态。

3、隔离性(Isolation)

        数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

        就如下图的上半部分,事务AB并发执行,但是不会相互影响。事务A在操作的时候,不会影响并发的事务B的执行;事务B在操作的时候,也不会影响并发的事务A的执行;它们两个是在独立的环境下运行的。

4、持久性(Durability)

        事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

        就如下图的下半部分,因为数据库当中的数据最后是存储在了磁盘当中的,而存储在磁盘当中的数据,就可以永久地保留下来。

四、并发事务问题

        并发事务问题是事务A和事务B在同时操作某一个数据库甚至一张表时,引发的问题。

1、赃读:一个事务读到另外一个事务还没有提交的数据

        比如,在事务A执行了 select 与 update 语句后,并未提交;但是在事务B中执行 select 语句后,却查询到了事务A未提交的数据。

2、不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读

        比如,在事务A两次读取同一条记录,却因为期间事务B中 id=1 的数据被更新且提交导致读取到的数据却是不一样的。

3、幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。

        比如,在事务A中第一次查询,没有查询到信息;然后事务B中插入并提交了id =1的数据;此时在事务A中插入 id = 1 的数据无法插入,因为 id 是主键,id =1的数据在事务B中就已经插入;但是在事务A中再查询一次后,又无法查询得到。

五、事务隔离级别

1、事务隔离级别的介绍        

        为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种

        Repeatable Read是MySQL的默认事务隔离级别

        事务隔离级别越高,数据越安全,但是性能越低;反之事务隔离级别越低,性能越高,但是数据越不安全。所以我们要权衡数据的安全性以及数据库的并发性能。

        其中,串行化指的是再进行并发事务操作的时候,一次只允许操作一个事务

        事务A在操作的时候,只有当事务A提交完成之后,事务B才能来操作。

        就比如上面幻读的例子中,如果是在串行化的情况下,因为事务A是在事务B之前执行,所以事务A执行完成之前,事务B根本无法执行下去。

        事务B执行insert语句在执行后,光标会一直卡着,直到事务A执行完毕后,事务B才会执行,这样就可以避免幻读。

2、操作事务隔离级别的语法

(1)查看事务隔离级别

select @@transaction_isolation

(2)设置事务隔离级别

-- session与global二选一

-- session 是指当前设置的事务隔离级别 仅对当前对话窗口有效

-- global 是指当前设置的事务隔离级别 对所有对话窗口有效

-- 后面的四个事务隔离级别四选一即可

set { session | global } transaction isolation level { Read Uncommitted | Read committed | Repeatable Read | Serializable}

3、实例分析(串行化)

        通过cmd打开两个命令行,在里面执行SQL语句,模拟两个并发事务。在下图中上面的命令行为事务A,下面的命令行为事务B。

(1)事务A还没有提交之前

        事务隔离级别为Serializable (串行化) 时,一次只允许操作一个事务,所以即便事务B的insert语句被执行了,光标也会一直卡着,无法执行,直到事务A执行完毕。

(2)事务A提交之后

        事务A提交后,事务B即可执行,但是此时 id = 3 的数据已经存在, 所以会报错

         
        以上即为MySQL 事务的全部内容,创作不易,麻烦三连支持一下呗~  

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

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

相关文章

c++之网络编程

网络编程:使得计算机程序能够在网络中发送和接受数据,从而实现分布式系统和网络服务的功能。 作用:使应用程序能够通过网络协议与其他计算机程序进行数据交换 基本概念 套接字(socket): 套接字是网络通信…

MySQL8的安装方法

概述: MySQL对于开发人员来说,并不陌生。但是很多朋友提起安装MySQL就很头疼,如果一不小心安装失败,再现安装第二遍就变得更加头疼。今天给大家分享一个比较非常简单好安装的方法,并且删除或者卸载也都非常容易 下载…

CF每日4题

1500左右的做到还是有点吃力 2093E 1500 二分答案 题意:给定一个长度为 n 的数组,现在要把它切成 k 份,求每一份最小的MEX中的最大值。 就是找最大值,但是这个值是所有段最小的值采用二分答案,二分这个值&#xff0…

基于 Spring Boot 瑞吉外卖系统开发(七)

基于 Spring Boot 瑞吉外卖系统开发(七) 新增菜品页面 菜品管理页面提供了一个“新增菜品”按钮,单击该按钮时,会打开新增菜品页面。 菜品分类列表 首先要获取分类列表数据。 请求路径/category/list,请求方法GE…

二项式分布html实验

二项式分布html实验 本文将带你一步步搭建一个纯前端的二项分布 Monte-Carlo 模拟器。 只要一个 HTML 文件,打开就能运行: 动态输入试验次数 n、成功概率 p 与重复次数 m点击按钮立刻得到「模拟频数 vs 理论频数」柱状图随着 m 增大,两组柱状…

大模型如何作为reranker?

大模型如何作为reranker? 作者:爱工作的小小酥 原文地址:https://zhuanlan.zhihu.com/p/31805674335 只为了感动自己而去做一些事情纯属浪费时间。 ————爱工作的小小酥 引言 用于检索的模型中,我们最熟悉的就是单塔和双塔了&…

发放优惠券

文章目录 概要整体架构流程技术细节小结 概要 发放优惠券 处于暂停状态,或者待发放状态的优惠券,在优惠券列表中才会出现发放按钮,可以被发放: 需求分析以及接口设计 需要我们选择发放方式,使用期限。 发放方式分…

试完5个AI海报工具后,我投了秒出设计一票!

随着AI技术的不断发展,越来越多的AI生成工具进入了设计领域,海报生成工具成为了其中的重要一员。今天,我们将为大家介绍三款热门的AI海报生成工具,并进行对比分析,帮助大家选择最适合的工具。 1. 秒出设计:…

PH热榜 | 2025-04-25

1. LambdaTest Accessibility Testing Suite 标语:轻松点击,确保网站的包容性和合规性。 介绍:LambdaTest 的可访问性测试工具可以自动识别你的网站和网络应用中是否符合 WCAG(网页内容无障碍指南)标准。你可以设置定…

模方ModelFun是什么?如何安装?

摘要:本文主要介绍模方ModelFun的软件简介、特性、安装环境配置、插件及软件安装。 1.软件简介 模方是一款实景三维模型的场景修饰与单体化建模工具,是建模的后处理软件,包括网格模型编辑和单体化建模两大模块。 场景修饰模块可以对 OBJ、OSG…

[AI Workflow] 基于多语种知识库的 Dify Workflow 构建与优化实践

在实际应用中,基于用户提供的资料快速构建高质量的知识库,并以此背景精准回答专业问题,是提升人工智能系统实用性的重要方向。然而,在跨语种环境下(如中、日、英混合资料与提问),传统的知识检索和回答生成流程往往面临匹配不准确、信息检索不全面的问题。 本文将介绍一种…

Pycharm(十六)面向对象进阶

一、继承 概述: 实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况, 我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中&…

WebGL图形编程实战【4】:光影交织 × 逐片元光照与渲染技巧

现实世界中的物体被光线照射时,会反射一部分光。只有当反射光线进人你的眼睛时,你才能够看到物体并辩认出它的颜色。 光源类型 平行光(Directional Light):光线是相互平行的,平行光具有方向。平行光可以看…

Java高频面试之并发编程-07

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:线程之间有哪些通信方式? 在 Java 多线程编程中,线程间通信(Inter-Thread Communica…

.NET代码保护混淆和软件许可系统——Eziriz .NET Reactor 7

.NET代码保护混淆和软件许可系统——Eziriz .NET Reactor 7 1、简介2、功能特点3、知识产权保护功能4、强大的许可系统5、软件开发工具包6、部署方式7、下载 1、简介 .NET Reactor是用于为.NET Framework编写的软件的功能强大的代码保护和软件许可系统,并且支持生成…

【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

【办公类-89-02】20250424会议记录模版WORD自动添加空格补全下划线

背景需求 4月23日听了一个MJB的征文培训,需要写会议记录 把资料黏贴到模版后,发现每行需要有画满下划线 原来做这套资料,就是手动按空格到一行末,有空格才会出现下划线,也就是要按很多的空格(凑满一行&…

解释器模式:自定义语言解析与执行的设计模式

解释器模式:自定义语言解析与执行的设计模式 一、模式核心:定义语言文法并实现解释器处理句子 在软件开发中,当需要处理特定领域的语言(如数学表达式、正则表达式、自定义配置语言)时,可以通过解释器模式…

AI催生DLP新战场 | 天空卫士连续6年入选Gartner 全球数据防泄漏(DLP)市场指南

“管理数据外泄风险仍然是企业的重大挑战之一,客户处出于各种因素寻求DLP。最近,一些组织对使用DLP控制机器对敏感信息的访问表现出很大兴趣。 随着生成式人工智能(GenAI)的运用和数据的不断扩散,数据外泄的问题变得更…