当前位置: 首页 > news >正文

MySQL数据库之——事务(Transaction)详解

一、MySQL 事务定义

        MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在银行管理系统中,用户张三向李四账户转账的操作,账户转账是一个完整的业务,最小的单元,不可再分,这样,完成转账操作的这些SQL语句之和就构成一个事务!

        总的来说,

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务通常用来管理 insert(增)、update(改)、delete(删) 语句。

二、事务满足四个条件

事务是必须满足4个条件原子性、一致性、隔离性、持久性。

        1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。

        例如:当事务在执行过程中发生错误时,已经被修改过的数据会回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

        2.持久性:当一个事务处理结束后,会进行commit提交操作,将处理后的数据从内存提交到磁盘中,保证数据的持久化存储。

        3.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则。

        4.隔离性:事务通常都是并发的,不同事务会同时对数据库中的数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

        事务的隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

三、MySQL中事务管理的相关SQL指令:

  • START TRANSACTION :显式地开启一个事务;

  • COMMIT :事务提交,将事务更新后的数据从内存保存进磁盘中,实现数据的持久保存;

  • ROLLBACK :事务回滚,结束当前正在进行的事务,并将已经修改但未提交的数据回滚到事务开始之前的状态;

  • SAVEPOINT 【标记点】该指令允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT 【标记点】 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO 【标记点】把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。

    InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED(读未提交)、READ COMMITTED(读提交)、REPEATABLE READ(可重复读) 和 SERIALIZABLE(串行化)。

其中我们最常用的两条语句就是commit事务提交和rollback事务回滚。

四、在MySQL中演示,简单事务提交与回滚

业务情形:id为1的用户(张三) 给 id为2的用户(李四) 转账100元

①首先有一张bank的表,所有用户的钱初始值都是200元

②在不开启事物的情况下

1.模拟转张操作(SQL代码)

#不开启事物的情况下:1.执行转张操作所需要的SQL语句
update bank SET money = money-100 WHERE id = 1;
update bank SET money = money+100 WHERE id = 2;

若未出现异常情况,该项转账业务成功执行;两个用户的钱发生正确变化;

2.模拟中途出现异常(SQL代码)

#首先,自定义一个异常叫money_error
DECLARE money_error CONDITION FOR 1148;2.模拟中途出现异常,转张执行失败
update bank SET money = money-100 WHERE id = 1;
money_error;
update bank SET money = money+100 WHERE id = 2;

如图所示,若中途出现异常,执行失败:发现数据只更改了一半,张三的钱少了,但收款方李四账户并没有多出100元

 

        像上述这种情况,在实际项目开发中肯定是不允许出现的,因此我们可以借助Mysql数据库中的事务管理,将转账这两条SQL语句封装成一条事务,使其具有不可分割性(原子性);

③使用MySql中事务管理,来模拟转账操作

  • 当开启事务管理后,若执行过程中遇到异常,那么被修改但未提交的数据则会回滚到初始值;

执行之前,两人都是200元;

1.模拟开启事务后执行转账操作

#开启事物管理---执行成功则提交到磁盘
start TRANSACTION;
update bank SET money = money-100 WHERE id = 1;
update bank SET money = money+100 WHERE id = 2;
commit;

当事务正常执行并提交(commit),两人的钱会发生对应的变化 

 

2.模拟转账操作执行过程中出现异常

#定义一个异常叫money_error
DECLARE money_error CONDITION FOR 1148;#开启事物管理---执行失败则会回滚到初始数据
start TRANSACTION;
update bank SET money = money-100 WHERE id = 1;
money_error;
update bank SET money = money+100 WHERE id = 2;
ROLLBACK;

当转账遇到异常时,进行事务回滚,两人的金额仍然是200元。

        通过以上的简单模拟,我们已经对事务有了一定了解;接下来让我们学习,如何在MyBatis中进行事务管理操作。

五、事务管理与MyBatis结合

前提:已经构建好MyBatis框架

①.首先我们创建一个用户表,用户初始余额都为200元

②编写转账操作对应SQL语句:

<!--  转账事物管理  --><!--  汇款人  --><update id="outMoney" parameterType="List" >update user set money = money-#{money} where id = #{id}</update><!--  收款人  --><update id="acceptMoney" parameterType="List" >update user set money = money+#{money} where id = #{id}</update>

③然后编写Dao层接口方法:

//事物管理测试://对于mapper的Dao层的接口,传入的参数有多个时必须使用@param进行标识,//汇款public void acceptMoney(@Param("money") float money,@Param("userId") Integer id);//收款public void outMoney(@Param("money")float money,@Param("userId")Integer id);

④最后是,转账业务的测试代码:

  • 无异常情况的情况下:
//首先是正常执行转账操作,没有异常时
public void transfer(){try{System.out.println("转账前:");mapper.findAll();//执行转张mapper.outMoney(100,1);mapper.acceptMoney(100,2);session.commit();//当未捕捉到任何异常时,提交事务System.out.println("转账后:");mapper.findAll();}catch (Exception e){e.printStackTrace();session.rollback();//一旦捕捉到异常,则将事务回滚}finally {if (session != null) {session.close();//最后释放资源}}}
  • 模拟一个转账异常

 @Testpublic void transfer(){try{System.out.println("转账前:");findAll();//执行转张mapper.outMoney(100,1);int x = 1/0; //模拟一个异常mapper.acceptMoney(100,2);session.commit();//当未捕捉到任何异常时,提交事务System.out.println("转账后:");findAll();}catch (Exception e){e.printStackTrace();session.rollback();//一旦捕捉到异常,则将事务回滚}finally {if (session != null) {//最后释放资源session.close();}}

⑤测试运行结果

  • 正常执行转张操作:

      

  • 若转账中途出现异常:

         当出现异常,转张操作会被中断,然后事务回滚;我们查看数据库,每个人的前仍为初始值200元。

        以上就是事务在实际开发过程中的应用,本篇文章是我在学习完数据库事务管理后的总结与笔记,如果大家喜欢,请多多点赞;若有错误,欢迎指正;

拓展:多事务之间并发可能会导致的问题:     

①脏读:

       ②不可重复读

                          
           ③幻读         

   

参考文章:

MySQL——事务(Transaction)详解_mysql事务-CSDN博客

MySQL 事务 | 菜鸟教程

相关文章:

MySQL数据库之——事务(Transaction)详解

一、MySQL 事务定义 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在银行管理系统中&#xff0c;用户张三向李四账户转账的操作&#xff0c;账户转账是一个完整的业务&#xff0c;最小的单元&#xff0c;不可再分&#xff0c;这样&#xff0c…...

LabVIEW提高开发效率技巧----事件日志记录

在LabVIEW开发中&#xff0c;集成事件日志记录系统是提升程序调试效率和确保系统运行稳定的关键步骤。通过记录关键操作和异常事件&#xff0c;开发人员可以快速定位问题、优化程序性能&#xff0c;并确保系统的稳定性和可靠性。 1. 事件日志的作用 事件日志是指在程序运行过…...

整合XXL-Job任务调度平台

创建数据库 tables_xxl_job.sql 引入依赖 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version> </dependency>编写配置文件 server:port: 8081xxl:job:admin:# 这…...

hi3536上ffmpeg带rtmp移植

1.下载ffmpeg-4.1.3版本源码包 用下面的脚本进行configure&#xff1a; ./configure \--target-oslinux \--prefix./libs/ \--enable-cross-compile \--archarm \--ccarm-hisiv500-linux-gcc \--cross-prefixarm-hisiv500-linux- \--nmarm-hisiv500-linux-nm \--enable-share…...

在PHP中,读取大文件

在PHP中&#xff0c;读取大文件可以采用以下几种方法&#xff1a; 1. 使用fopen和fread函数&#xff1a;这是最基本的文件读取方法&#xff0c;可以逐行读取大文件。首先使用fopen函数打开文件&#xff0c;然后使用fread函数指定读取的字节数&#xff0c;逐行读取文件内容并进…...

N-gram详解

文章目录 一、什么是N-gram?二、N-gram的种类三、优缺点PS&#xff1a;补充 一、什么是N-gram? 在自然语言处理中&#xff0c;n-gram是一种重要的文本表示方法。n-gram是指给定文本中连续的n个项目&#xff0c;这些项目可以是声音、单词、字符或者像素等。n-gram模型常常用于…...

电路中的电源轨及地的区别和处理

电源轨 VCC 通常代指正电源供电轨。在大多数数字和模拟电路中&#xff0c;VCC代表电路中的正电源端。VCC提供电路所需的正电压&#xff0c;通常是用来驱动晶体管、集成电路。 VDD 相对与VCC的正电源供应&#xff0c;VDD更常用于表示数字电路中的正电源引脚。VDD常见于集成电…...

k8s可以部署私有云吗?私有云部署全攻略

k8s可以部署私有云吗&#xff1f;K8S可以部署私有云。Kubernetes是一个开源的容器编排引擎&#xff0c;能够自动化容器的部署、扩展和管理&#xff0c;使得应用可以在各种环境中高效运行。通过使用Kubernetes&#xff0c;企业可以在自己的数据中心或私有云环境中搭建和管理容器…...

编辑器资源管理器

解释 EditorResMgr 是一个用于在 Unity 编辑器中加载资源的管理器。它通过 Unity 编辑器的 API (AssetDatabase) 进行资源加载&#xff0c;但仅在开发和编辑模式下可用&#xff0c;不能在最终发布的游戏中使用。这种工具通常用来在开发过程中快速加载编辑器中的资源&#xff0…...

高性能数据分析利器DuckDB在Python中的使用

DuckDB具有极强的单机数据分析性能表现&#xff0c;功能丰富&#xff0c;具有诸多拓展插件&#xff0c;且除了默认的SQL查询方式外&#xff0c;还非常友好地支持在Python、R、Java、Node.js等语言环境下使用&#xff0c;特别是在Python中使用非常的灵活方便。 安装 pip insta…...

IAR全面支持旗芯微车规级MCU,打造智能安全的未来汽车

中国上海&#xff0c;2024年10月18日 — 在全球汽车电子快速发展的今天&#xff0c;IAR与苏州旗芯微半导体有限公司&#xff08;以下简称“旗芯微”&#xff09;联合宣布了一项激动人心的合作——IAR Embedded Workbench for Arm 9.60.2版本现已全面支持旗芯微车规级MCU&#x…...

**深入浅出:TOGAF中的应用架构**

摘要&#xff1a; 在企业架构&#xff08;EA&#xff09;领域&#xff0c;TOGAF&#xff08;The Open Group Architecture Framework&#xff09;是一个广泛应用的框架。本文将带你深入了解TOGAF中的应用架构&#xff0c;帮助你理解其核心概念和实际应用。无论你是初学者还是有…...

Pytorch学习--DataLoader的使用

一、DataLoader简介 DataLoader官网 重要参数&#xff1a;画红框的参数 dataset: 作用&#xff1a;表示要加载的数据集。DataLoader通过该参数从数据集中读取数据。类型&#xff1a;Dataset&#xff0c;即PyTorch定义的Dataset类&#xff0c;用于封装数据并提供数据索引的功…...

代购系统界的“数据大厨”:定制API数据处理,烹饪出美味佳肴

在这个代购的盛宴中&#xff0c;每一位代购者都是一位大厨&#xff0c;他们用数据作为食材&#xff0c;用代码作为烹饪技巧&#xff0c;烹饪出一道道令人垂涎的美味佳肴。今天&#xff0c;就让我们走进代购界“数据大厨”的厨房&#xff0c;看看他们是如何定制API数据处理&…...

二十、Innodb底层原理与Mysql日志机制深入剖析

文章目录 一、MySQL的内部组件结构1、Server层1.1、连接器1.2、查询缓存1.3、分析器1.4、优化器1.5、执行器 2、存储引擎层 二、Innodb底层原理与Mysql日志机制1、redo log重做日志关键参数2、binlog二进制归档日志2.1、binlog日志文件恢复数据 3、undo log回滚日志4、错误日志…...

数据库设计与管理的要点详解

目录 前言1 数据库设计的基础&#xff1a;清晰的事实表1.1 确保数据的一致性和完整性1.2 优化查询性能 2 权限问题与数据问题的区分2.1 确认权限问题2.2 确认数据问题 3 视图与存储过程的合理使用3.1 视图的作用与应用3.2 存储过程的应用与优化 4 数据库操作日志的设计4.1 确保…...

国家科技创新2030重大项目

国家科技创新2030重大项目涵盖多个领域&#xff0c;例如&#xff1a;量子信息、人工智能、深海空间站、天地一体化信息网络、大飞机、载人航天与月球探测、脑科学与类脑研究、健康保障等&#xff0c;这些项目旨在解决制约我国经济社会发展的重大科技瓶颈问题&#xff0c;提升国…...

如何使用 Flutter Local Notifications 插件

如何使用 Flutter Local Notifications 插件 local_notificationsNo longer in development -Flutter plugin for creating notifications项目地址:https://gitcode.com/gh_mirrors/lo/local_notifications 项目介绍 Flutter Local Notifications 是一个为 Flutter 应用程序…...

【openEuler/Centos】yum安装软件报Error: GPG check FAILED【分析根因弄明白,亲测有效不浪费时间】

yum安装软件报Error: GPG check FAILED 环境信息&#xff1a;cat /etc/openEuler-release openEuler release 22.03 (LTS-SP1) 报错信息 The downloaded packages were saved in cache until the next successful transaction. You can remove cached packages by executin…...

实现vuex源码,手写

实现vuex源码&#xff0c;手写 Vuex 是专门为 Vue.js 应用程序开发的状态管理模式 库&#xff0c;它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 第一步&#xff1a;定义初始化Store类 创建文件夹store/vuex.js 1…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...