数据库:事务

server/2025/3/28 8:46:45/

日常生活中,经常涉及到事务。事务是数据库操作的基本单位,它代表了一系列操作,这些操作要么全部成功执行,要么全部不执行,以确保数据的一致性和完整性。

比如转账业务:现在张三和李四都各有200元,张三要给李四转账100元,那么转账成功后,张三的金额为100元,李四的金额为300元,该事务在数据库中的操作需要执行两条SQL命令,这两条SQL命令必须同时成功或失败 。

update act set money=100 where id = 1;
update act set money=300 where id = 2;

但仅执行这两条基本SQL命令是无法实现的,必须要引入SQL事务。

一、什么是事务?

事务本身是一个完整的业务流程,是不可再分的工作单元。

事务只和DML(增删改)语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。

二、事务的四大特征(ACID)

1、原子性

原子性指一个事务是一个不可分割的工作单位,其中的操作要么都成功,要么都失败,不可能出现第三种情况。

本质上是通过MySQL底层的日志来实现的。

2、持久性

持久性指实物一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

用上述示例简单解释一下,现在事务成功提交,即张三向李四转账成功后,张三金额为100元,李四金额为300元。如果此时MySQL出现某些故障,张三和李四的金额也不会回到转账前的各为200元的状态,因为事务已经提交,任何操作和故障都不会影响到它。

3、隔离性

隔离性指事物内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

仍然是上述示例简单解释,假如现在张三向李四转账100元,王五又向张三转账100元,直接让王五向李四转账100元,张三账户不变是符合逻辑的吗?答案一定是不,因为事务和事务之间是隔离的,互不干扰的。

4、一致性

事务执行的结果必须是使数据库从一个一致状态变到另一个一致状态。

依旧是上述示例,张三向李四成功转账100元后,虽然张三和李四的金额变了,但相加起来的总金额是不变的,仍是400元。
 

三、MySQL如何实现事务?

首先,我们先实现张三给李四转账100元。

  • 无事务版并且完成转账:
update act set money=100 where id = 1;
update act set money=300 where id = 2;

以上的写法并没有添加事务,那么一旦在SQL执行过程中出现了问题,就会出现意料之外的错误,这是不可忍受的。

比如第一条SQL语句成功实现,但第二条SQL语句可能由于id错误导致失败,这样就不能保证一致性,导致错误发生。

为解决以上问题,我们可以添加事务,开启事务之后,能成功保证这两条SQL语句同时成功或失败。

(1)开启事务

start transaction;

(2)实现转账业务

update act set money=100 where id = 1;
update act set money=300 where id = 2;

(3)提交事务

commit;

运行,转账成功:

事务的优点在于:SQL在执行的过程中一旦出现问题,可以进行回滚回到原来的状态。 

(5)事务的回滚

rollback;

比如第二条SQL语句中的id出现错误,即使第一条SQL语句可以正常执行,但由于我们添加了事务的回滚,所以会回到最初的状态,即转账失败。


http://www.ppmy.cn/server/176728.html

相关文章

电路基础【3】:三极管基础:三极管开关电路与三极管放大电路(一篇讲明白!建议收藏!)

电路基础【3】:三极管基础:三极管开关电路与三极管放大电路 文章目录 电路基础【3】:三极管基础:三极管开关电路与三极管放大电路前言一、 三极管开关电路中的电阻分析1.1 光敏电阻1.2 b基极限流电阻(4.7kΩ)1.3 集电极下拉电阻&a…

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 (图1-1) 一、鸿蒙中App、HAP、HAR、HSP是什么? (1)App Pack(Application Package) 是应用发布的形态,上架应用市场是以App Pa…

C++回顾 day1

cout格式化输出 cout << setiosflags(ios::left) << setw(8) << a << endl; 重载&#xff1a;名字相同&#xff0c;意义不同 函数名相同&#xff0c;参数列表不同&#xff08;类型&#xff0c;个数&#xff0c;顺序&#xff09; 返回值类型不构成重…

【C++】动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题&#xff1a; 最优子结构&…

lua实现面向对象(封装/继承/多态)

lua实现面向对象封装/继承/多态 lua实现面向对象(封装/继承/多态) lua实现面向对象(封装/继承/多态) print("***********面向对象**********") print("*************封装************") --表就是表现类的一种形式 --实现了new方法:本质上是创建一个空表&a…

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理&#xff0c;欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图&#xff1a; 注意&#xff0c;下面谈及的所有方式&#xff0c;都要求两者的IP地址处于同一网段&#xff0c;涉及到的软件资源见felm。 一、Windows主…

游戏引擎学习第168天

回顾并计划今天的内容 今天我们将进行一些思考工作&#xff0c;回顾一下之前的工作。我们已经在资产处理工具中提取了字体&#xff0c;并展示了如何使用该库。我们有两个版本&#xff0c;一个不使用任何库&#xff0c;适合想要完全不依赖库的用户&#xff1b; 我们今天的任务…

密码学(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念&#xff1a;离散对数是密码学中一个重要的数学问题&#xff0c;特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说&#xff0c;给定一个群 G G G和一个生成元 …