MySQL事务全解析:从概念到实战

news2025/3/24 20:59:16

在数据库操作中,事务是一个至关重要的概念,它确保了数据的完整性和一致性。今天,就让我们深入探讨MySQL事务的方方面面,从基础概念到实际应用,全面掌握这一技能。

一、为什么需要事务

假设张三要给李四转账100元,这涉及到两个操作:张三的账户减少100元,李四的账户增加100元。在数据库中,这就相当于两条SQL语句:

UPDATE act SET money = money - 100 WHERE id = 张三的账户ID;
UPDATE act SET money = money + 100 WHERE id = 李四的账户ID;

如果第一条语句执行成功,而第二条语句执行失败,就会导致张三的钱被扣了,但李四却没有收到,这显然是不合理的。因此,我们需要一种机制来确保这两个操作要么同时成功,要么同时失败,这就是事务的作用。

二、什么是事务

事务是数据库中一个完整的业务流程,是一个不可再分的工作单元。它与数据操作语言(DML)语句紧密相关,因为DML语句(如INSERT、UPDATE、DELETE)会改变数据库中的数据,而事务就是要保证这些操作的完整性和一致性。

举个例子,一个网上购物的流程可能包括:检查库存、下单、扣款、发货等多个步骤,这些步骤共同构成了一个事务。只有当所有步骤都成功完成,整个事务才算成功;如果其中任何一个步骤出错,整个事务都会回滚,恢复到事务开始之前的状态。

三、事务的四大特征

(一)原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,其中的操作要么全部成功,要么全部失败。就像刚才提到的转账操作,要么张三和李四的账户都更新成功,要么都不更新,不允许只更新一个的情况。

(二)持久性(Durability)

持久性意味着一旦事务提交,它对数据库的改变是永久性的。即使系统发生故障,比如服务器崩溃、断电等,已经提交的事务结果也不会丢失。这是因为数据库会将事务的最终结果写入磁盘等永久存储介质。

(三)隔离性(Isolation)

隔离性确保了事务内部的操作与其他事务是隔离的,多个事务并发执行时不会互相干扰。例如,当两个用户同时购买同一商品时,他们的操作不会相互影响,系统会按照一定的隔离级别来处理这些并发事务。

(四)一致性(Consistency)

一致性要求事务的执行结果必须使数据库从一个一致状态变为另一个一致状态。在转账例子中,事务前后,数据库中张三和李四的账户总金额应该保持不变,这就是一致性。

四、MySQL中如何使用事务

在MySQL中,可以使用以下语句来控制事务:

START TRANSACTION;  -- 开始一个事务
COMMIT;  -- 提交事务,使所有操作永久生效
ROLLBACK;  -- 回滚事务,撤销所有操作

(一)简单示例

START TRANSACTION;

UPDATE act SET money = money - 100 WHERE id = 张三的账户ID;
UPDATE act SET money = money + 100 WHERE id = 李四的账户ID;

COMMIT;

在这个例子中,我们首先开始一个事务,然后执行两条更新语句,最后提交事务。如果在这两条更新语句之间发生任何错误,比如第二个更新失败,我们就可以使用ROLLBACK来撤销第一个更新的操作,保证数据的一致性。

(二)处理异常情况

START TRANSACTION;

UPDATE act SET money = money - 100 WHERE id = 张三的账户ID;

-- 假设这里出现了错误,比如网络问题等
IF 错误发生 THEN
    ROLLBACK;
ELSE
    UPDATE act SET money = money + 100 WHERE id = 李四的账户ID;
    COMMIT;
END IF;

在这个示例中,我们根据是否发生错误来决定是回滚事务还是继续完成事务。这在实际开发中非常常见,因为我们需要处理各种可能的异常情况。

五、MyBatis对事务的配置

MyBatis是一个优秀的持久层框架,它对事务的配置也非常灵活。

(一)配置文件

在MyBatis的配置文件中,可以通过transactionManager标签来配置事务管理器:

<environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <!-- 数据源配置 -->
    </dataSource>
</environment>

这里type="JDBC"表示使用JDBC的事务管理方式。

(二)代码中控制事务

在实际的Java代码中,我们可以通过以下方式来控制事务:

SqlSession session = MyBatisUtil.getSqlSession();
try {
    // 执行数据库操作
    session.commit();  // 提交事务
} catch (Exception e) {
    session.rollback();  // 回滚事务
} finally {
    session.close();
}

通过这种方式,我们可以在代码中灵活地控制事务的提交和回滚,确保数据的完整性。

六、总结

事务是数据库操作中不可或缺的一部分,它保证了数据的完整性和一致性。通过理解事务的四大特征,以及在MySQL和MyBatis中的具体应用,我们可以在实际开发中更好地处理复杂的业务逻辑,避免数据异常。

希望这篇博客能帮助你深入理解MySQL事务,如果你有任何问题或建议,欢迎在评论区留言!

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

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

相关文章

手机怎么换网络IP有什么用?操作指南与场景应用‌

在数字化时代&#xff0c;手机已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在手机的使用过程中&#xff0c;网络IP地址作为设备在互联网上的唯一标识符&#xff0c;其重要性和作用不容忽视。本文将…

科技赋能安全:慧通测控的安全带全静态性能测试

汽车的广泛普及给人们的出行带来了极大便利&#xff0c;但交通事故频发也成为严重的社会问题。据世界卫生组织统计&#xff0c;全球每年约有 135 万人死于道路交通事故&#xff0c;而安全带在减少事故伤亡方面起着不可替代的作用。正确使用安全带可使前排驾乘人员的死亡风险降低…

记录修复一个推拉门滑轮

推拉门有个滑轮的固定螺丝不知什么时候掉了&#xff0c;也找不到&#xff0c;这就导致推拉门卡在轨道上。 这种滑轮在夕夕上很便宜&#xff0c;比哈罗单车还划算&#xff0c;但是现在缺的只是螺丝&#xff0c;如果买就会多出来一个轮… 这种螺丝比较长&#xff0c;大概是m4的…

压缩壳学习

壳是什么 壳就是软件的一个保护套&#xff0c;防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的&#xff1b;加密壳&#xff0c;通过加密软件来保护软件&#xff…

深入理解 Linux ALSA 音频架构:从入门到驱动开发

文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…

CCF-CSP认证 202206-2寻宝!大冒险!

题目描述 思路 有一张绿化图和藏宝图&#xff0c;其中绿化图很大&#xff08;二维数组在限定的空间内无法存储&#xff09;&#xff0c;而藏宝图是绿化图中的一部分&#xff0c;对于绿化图和藏宝图&#xff0c;左下角的坐标为(0, 0)&#xff0c;右上角的坐标是(L, L)、(S, S)&…

仿函数 VS 函数指针实现回调

前提&#xff1a; 本博客对比 函数指针实现回调 和 仿函数 &#xff0c;突出仿函数的优势。 目的&#xff1a; 一个类要能够灵活的调用两个函数&#xff0c;essfc 和 greaterfc&#xff0c;分别用于比较两个整数的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判断 x …

MQTT的安装和使用

MQTT的安装和使用 在物联网开发中&#xff0c;mqtt几乎已经成为了广大程序猿必须掌握的技术&#xff0c;这里小编和大家一起学习并记录一下~~ 一、安装 方式1、docker安装 官网地址 https://www.emqx.com/zh/downloads-and-install/broker获取 Docker 镜像 docker pull e…

PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具

PRODIGY&#xff08;全称为 PROtein binDIng enerGY prediction&#xff09;是一种蛋白质结合能预测工具&#xff0c;可利用蛋白质-蛋白质复合物的三维结构来预测其结合亲和力。PRODIGY 利用一种高效的基于接触的方法&#xff0c;在估计结合自由能和解离常数的同时&#xff0c;…

C++之 【模板初阶(函数模板与类模板)】

目录 1.泛型编程 2.模板 3函数模板 3.1函数模板的概念 3.2函数模板的格式 3.3函数模板的原理 3.4函数模板的实例化 3.4.1隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 3.4.2显示实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 3.…

在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问

一、说明 上一章折腾了半天&#xff0c;搞出不少问题&#xff0c;今天我们在deepseek的帮助下&#xff0c;完成多个独立ubuntu24.04实例的安装&#xff0c;并完成固定ip&#xff0c;实践证明&#xff0c;deepseek不靠谱&#xff0c;浪费我2个小时时间&#xff0c;我们将在下面实…

在刀刃上发力:如何精准把握计划关键节点

关键路径分析是项目管理中的一种重要方法&#xff0c;它通过在甘特图中识别出项目中最长、最关键的路径&#xff0c;来确定项目的最短完成时间。 关键路径上的任务都是项目成功的关键因素&#xff0c;任何延误都可能导致整个项目的延期。关键路径分析对于项目管理者来说至关重要…

组合总和||

1.给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 #include <bits/stdc.h> using namespace std; vector<vector<int>> result; vec…

OpenCV图像拼接(2)基于羽化(feathering)技术的图像融合算法拼接类cv::detail::FeatherBlender

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::FeatherBlender 是 OpenCV 中用于图像拼接的一个类&#xff0c;它属于 stitching 模块的一部分。这个类实现了基于羽化&#xff08;…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例9,TableView15_09带排序的导出表格示例

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

spring boot 登入权限RBAC模式

首先准备好5张表 user_info表&#xff0c;用户的信息表 role表&#xff0c;角色表&#xff08;比如超级管理员、管理员、审核员、采购......&#xff09; 创建user_role表&#xff0c;user_info表&#xff0c;role表的中间表 注意了&#xff0c;role_id和user_id是 u…

调用API拿到的值——存储方式

1.响应结果示例&#xff1a; "purposeTagList":["稳中向好及进中提质"] 2.数据库中定义的 3.值的获取&#xff1a; F1 JsonNode purposeTagListNode dataNode.path("purposeTagList");if (purposeTagListNode.isArray()) {StringBuilder purp…

第一讲 | 解锁C++编程能力:基础语法解析

C入门基础 一、C的第一个程序二、命名空间三、C输入&输出四、缺省参数/默认参数五、函数重载六、引用1.引用的特性2.引用的使用引用做返回值场景 3.const引用只有指针和引用涉及权限放大、缩小的问题&#xff0c;普通变量没有 4.指针和引用的关系 七、inline八、nullptr 一…

C++ --- 多态

1 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…

HAL库中使用空闲中断+DMA接收数据,接收失败的问题

问题&#xff1a; 串口屏与单片机通过串口&#xff08;USART1&#xff09;进行通信&#xff0c;调试时发现问题&#xff0c;现象如下&#xff1a; 手动页面的几个文本&#xff0c;输入的数字不会显示出来&#xff0c;比如初始值为0&#xff0c;输入200&#xff0c;200会一闪而…