一文搞懂数据库事务

数据库事务(超详细) 本节主要讲解数据库事务,从事务的定义、事务的特性、编程式事务管理、事务的隔离级别、通过JDBC操作事务等等方面来帮助深刻理解数据库事务 阅读详情

一. 什么是事务?

1.1 为什么使用事务

数据库将数据有条理的存放在磁盘上, 支持数据的增删改查, 并在过程中保障数据的正确和可靠.

但想要做到这点并不容易, 举一个常见的例子就是银行转账: A账户给B账户转账2000(M1)当作生活费.

在交易的过程中, 就有几个问题出现了:

  • 怎么保证在A账户减少1000的同时B账户增加1000.
  • 如何保证在大量交易的同时, 数据仍是合法的, 钱没有凭空产生或消失.
  • 如果交易完成时, 数据库恰好崩溃, 那么如何保证交易数据成功保存在数据库中?
  • A账户如果同时在和C账户交易(M2), 如何让这两笔交易互不影响?

要保证交易的正常进行, 数据库就要解决以上的问题, 这就是事物诞生的原因.

1.2 事物的概念

数据库中: 事务(Transaction)是访问和更新数据库的程序执行单元, 事务中可能包含一个或多个sql语句, 这些语句要么都执行, 要么都不执行.

通俗来讲, 就是将多个操作打包在一起执行, 要么都执行, 要么都不执行(回滚).

二. 事务的四大特性(ACID)

2.1 原子性(Atomicity)

事务是数据库的逻辑工作单位, 事务中包括的操作要么全执行, 要么全不执行.

这里的"全不执行"不是真的指一个操作也不执行.

举个例子, 假如一个事务中有三个操作: 操作1, 2, 3.

先执行1, 再执行2, 最后执行3.

如果三个操作都执行成功了, 那么这个事务的所有操作都执行了.

如果操作1, 2执行成功了, 操作3失败了, 那么就自动地把前面已经执行成功的操作还原回最初没有执行的摸样. 这个操作, 就叫回滚

因此, "全不执行"只是看起来没执行.

回滚是如何实现的?

将数据库事务操作的中间操作通过特定的日志记录下来. 如果需要回滚, 就直接按照之前操作的逆操作来执行. 而且日志中的数据始终在硬盘上存在, 即使数据库的服务器崩溃, 再重启之后, 针对之前没有回滚玩的情况会继续处理.

利用这个特点, 我们就不用担心在交易过程中遇到程序崩溃或者是服务器崩溃, 而产生的A账户减少2000而B账户没收到钱 或者是 A账户钱没变但B账户凭空出现2000. A和B账户的金额变动要么同时成功, 要么同时失败.

这里要注意的是, MySQL中, InnoDB存储引擎支持回滚机制, 但是MyIsam并不支持. 所以大家如果发现自己的MySQL没有进行回滚操作, 那么你使用的存储引擎可能就是MyIsam

2.2 一致性(Consistency)

MySQL中: 一致性是指事务执行结束后, 数据库的完整性约束没有被破坏, 事务执行的前后都是合法的数据状态。

数据库的完整性约束包括但不限于: 实体完整性(如行的主键存在且唯一), 列完整性(如字段的类型, 大小, 长度要符合要求) , 外键约束, 用户自定义完整性(如转账前后, 两个账户余额的和应该不变, 不能是A账户余额-2000, B账户余额+200 或者是 +3000 或者是其他)

如何保证数据的一致性?

一是通过约束; 二是通过回滚

2.3 持久性(Durability)

事务一旦提交,它对数据库的改变就应该是永久性的(写入了硬盘), 无论发生什么(崩溃或者出错).

2.4 隔离性(Isolation)

与其他特性侧重于研究事物本身不同, 隔离性研究的是不同事物之间的相互影响.

隔离性是指, **事物内部的操作与其他事务是隔离的, 并发执行的各个事物之间不能互相干扰. **隔离性越高, 并发性越低, 数据越可靠, 性能越低.

并发执行事务, 也就是同时执行多个事务, "同时"是指在宏观上是同时的, 但是微观上还是有先有后的.

通常使用锁机制来保证事物的隔离性.

若不保证事物的隔离性, 那么可能会出现数据的脏读, 不可重复读和幻读.

2.4.1 脏读, 不可重复读和幻读

(1) 脏读

事务A正在访问并修改数据, 事务B读到了A未提交的数据(脏数据), 这种现象就是脏读. 通过脏读读到脏数据是临时的, 不是最终准确的数据.

时间A事务B事务
T1开始事务开始事务
T2修改Tom的余额, 将余额由1000改成3000
T3读取Tom的余额, 结果为3000[脏读]
T4修改Tom的余额, 将余额由1000改成5000
T5提交事务提交事务
(2) 不可重复读

在事务A中先后读取同一个数据, 两次读取的数据不一样, 这种现象就叫不可重复读.

脏读和不可重复读的区别在于: 脏读读到的是其他事务未提交的的数据; 不可重复读读到的是其他事物已经提交的数据.

时间事务A事务B
T1开始事务
T2查询Tom的余额, 为1000
T3其他操作开始事务
T4修改Tom的余额, 1000->3000
T5提交事务
T6查询Tom的余额, 为3000
T5提交事务
(3) 幻读

事务A按照一定条件进行数据读取, 期间事务B插入或删除了相同搜索条件的新数据, 事务A再次按照原来的条件进行读取时, 发现了事务B新插入或删除的数据. 也就是说, 在事务A中按照某个条件先后两次查询数据库, 两次查询结果的条数不同, 这种现象叫做幻读.

时间事务A事务B
T1开始事务开始事务
T2查询条件1下的数据数, 100条
T3新增100条符合条件1的数据
T4提交事务
T5查询条件1下的数据数, 200条

不可重复读和幻读的区别:

  • 不可重复读是前后读取到了不同的数据, 针对的是update操作
  • 欢度是读取到了其他事物新增的数据, 针对的是insert和delete操作.

2.4.2 事务的隔离级别

SQL标准中定义了四种隔离级别, 并规定了每种隔离级别下, 上述几个问题是否存在.

隔离级别有4个, 由低到高分别为Read Uncommitted , Read Committed, Repeatable Read , Serializable.

脏读不可重复读幻读
Read Uncommitted(RU)✔️✔️✔️
Read Committed(RC)✖️✔️✔️
Repeatable Read(RR)✖️✖️✔️
Serializable✖️✖️✖️
  • DEFAULT

    默认值, 表示使用底层数据库的默认隔离级别, MySQL默认为(RR)

  • Read Uncommitted(读未提交)

    该级别表示事务A可以读取到事务B修改但是还没有提交的数据.

  • Read Committed(读提交)

    该级别表示事务A只能读取事务B已经提交的数据.

  • Repeatable Read(可重复读)

    该级别表示事务A在整个过程中可以多次读取某个数据, 并且每次返回的记录都相同, 即使在多次读取之间事务B修改了这个数据, 返回的还是修改前的数据.

    但如果事务B没有修改现有数据, 而是添加了新的数据, 事务A是可以读取到新增数据的.

  • Serializable(串行化)

    最高级别的隔离, 两个同时发生的事务100%隔离. 事务依次执行.

事务的隔离级别越高, 并发性越低, 数据可靠性越高, 效率越低.

三. 事务的使用

  1. 开启事务

    start transaction;
    
  2. 输入多个sql语句

  3. 提交事务 / 手动触发回滚

    提交事务:

    commit;//全部执行
    

    回滚:

    rollback;//全不执行
    

⚠️一个事物必须要以commit;或者rollback;结尾, 否则接下来的操作都会被认为是事务的一部分.

数据库Mysql)的事物详解 事物保证事物内的一组数据库命令同时成功或者失败。这些概念不好理解,接下来举例说明,如下图有一张表张三和李四账户中各有100块钱,现李四需要转换500块钱给张三,具体的转账操作为现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500;这样的系统是有问题的。如果解决呢?使用事务可以解决上述问题从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。开启事务 提交事务 回滚事务 事物代码验证 阅读详情

相关推荐

大尺寸智能车的CAN驱动控制器制作(一)

本驱动板使用8个半H桥BTS7960驱动,使用CAN接口于车体主控制器通讯,最大承受电压48V 电流20A ,主控为STM32F103VET6,电机控制频率为18KHz,CAN通讯芯片为TJA1042T,全驱动板6-24V宽电压供电,采用24V降5V,5V降3.3V的方案供电,其中经过AMS1117作为降压芯片,可以有效降低主控损毁几率。在这里可以看到555电机相比于其他电机的功率大很多,所以需要大功率的电机驱动,在以往的电机驱动选型中选择了TB6612,L298N等小功率电机驱动。

技术的力量能够改变世界 544

多表的多种连接查询和事务ACID

1.多表之间的多种连接查询 文章目录1.多表之间的多种连接查询1.交叉查询2.外连接2.1 左外连接2.2 右外连接3.内连接(重点)3.1 隐式内连接3.2 显式内连接3.3 举个栗子。。。2.子查询(重点)2.1 解析2.2 子查询进阶3.事务3.1 事务的解释:3.2 事务作用:3.3 MYSQL事务管理3.3.1什么是回滚点3.3.2 回滚点的操作语句3.3.3具体操作3.3.4应用场...

weixin_44070630的博客 890

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 584

数据库事务

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典的例子就是转账:操作: 张三和李四各自的账号都是1000元;张三向李四转账100元组成单元: 张三钱-100, ls钱+100操作成功: 张三钱900,ls钱1100操作失败: 张三钱1000,ls钱1000不可能发生: 张三钱900,ls钱1000;zs钱1000,ls钱1100二、MySQL进行事务管理。

m0_71385552的博客 2848

一文带你搞懂数据库事务

举个例子:A(余额1500元)向B(余额500元)银行转账500元,这里面会涉及到两个操作。1、 A的账户余额减少500,此时余额应为1000元。2、 B的账户余额增加500,此时余额应为1000元如果这两个操作中间出现了失误,比如银行系统突然崩溃了,导致A账户余额减少500,但是B账户余额并没有增加,这样的系统明显是有问题的。要么A转账成功(两个操作全部完成),要么A转账失败(两个操作全部不执行),这样AB用户才能接受这样的转账结果。

supeerzdj的博客 208

一文搞懂 Spring 数据库事务操作!

作者|阿文,责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN(ID:CSDNnews)今天我们一起了解下Spring的数据库事务操作。在操作数据库时,我们经常会使...

CSDN资讯 4109

一文搞懂MySQL事务数据库事务隔离级别)

事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。 一般来说,事务是必须满足4个条件(ACID):原子性、一致性、隔离性、持久性。- 脏读读取到的是一个未提交的数据,不可重复读读取到的是前一个事务提交的数据 - 不可重复读的重点是修改: 同样的条件,你读取过的数据,再次读取出来发现值不一样了 - 幻读的重点在于新增或者删除:同样的条件,第 1 次和第 2 次读出来的记录数不一样 事务提交方式:显示提交、隐示提交、自动提交

我本可以 1027

事务嵌套陷阱频发?,一文搞懂Laravel 10 DB::transaction底层原理

深入解析Laravel 10数据库事务DB::transaction底层机制,破解事务嵌套常见陷阱。涵盖实际应用场景、自动回滚原理与异常处理策略,助你掌握事务控制核心技巧,提升数据一致性与代码健壮性,值得收藏。

PixelGlow的博客 963

jdbctemplate 事务_一文搞懂 Spring 数据库事务操作!

文章来源:https://mp.weixin.qq.com/s/VlNe2blmVpajsO0txvgQWg作者:阿文今天我们一起了解下Spring的数据库事务操作。在操作数据库时,我们经常会使用到事务,为此Spring 提供了专门的用于处理事务的API方便开发者调用,那么本文就着重来讲解下Spring 对于事务的相关功能。1.Spring 事务的核心接口Spring 通过一个名为spring-t...

weixin_33258874的博客 161

MySQL数据库事务与锁详解说明一文搞懂

事务的典型场景在项目里面,什么地方会开启事务,或者配置了事务?无论是在方法上加注解,还是配置切面。 比如下单,会操作订单表,资金表,物流表等等,这个时候我们需要让这些操作都在一个事务里面完成。当一个业务流程涉及多个表的操作的时候,我们希望它们要么是全部成功的,要么都不成功,这个时候我们会启用事务。在金融的系统里面事务配置是很常见的,比如行内转账的这种操作,如果我们把它简单地理解为一个账户的余额增加,另一个账户的余额减少的情况(当然实际上要比这 复杂),那么这两个动作一定是同时成功或者同时失败的,否则就会造成

程序源日志的博客 254

MySQL 事务入门:从案例到 ACID 特性,一文搞懂数据库可靠性保障

MySQL事务是确保数据操作一致性的关键机制。文章首先通过转账案例说明事务的必要性,详细介绍了事务的语法(BEGIN/COMMIT/ROLLBACK)和ACID四大特性:原子性(通过undolog实现回滚)、持久性(redolog保障数据持久化)、隔离性(MVCC和锁机制控制并发)和一致性(业务规则的最终目标)。接着分析了并发事务可能出现的脏读、不可重复读、幻读和丢失修改问题,并介绍了四种隔离级别(RU/RC/RR/SERIALIZABLE)及其解决方案。最后指出锁机制是理解事务隔离性的重要基础,为后续深入

2301_80008738的博客 1102

什么是数据库事务一文搞懂 ACID 四大特性(一)

本文介绍了数据库事务的核心概念及其重要性,通过银行转账案例展示了没有事务机制可能导致的数据不一致问题。事务是一组数据库操作的集合,遵循“全做或全不做”原则,确保操作要么全部成功提交,要么全部回滚。文章详细解析了事务的四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),并强调了不同数据库引擎对事务的支持差异,例如InnoDB支持事务而MyISAM不支持。最后,通过实操演示展示了事务的原子性和持久性,验证了事务在数据

2401_85011172的博客 540

mybatisplus 操作另一个数据库的数据_一文搞懂 Spring 数据库事务操作!

今天我们一起了解下Spring的数据库事务操作。在操作数据库时,我们经常会使用到事务,为此Spring 提供了专门的用于处理事务的API方便开发者调用,那么本文就着重来讲解下Spring 对于事务的相关功能。1.Spring 事务的核心接口Spring 通过一个名为spring-tx-4.3.6-RELEASE 的JAR包来管理事务,在这个JAR包中的org.Springframework.tra...

weixin_39775106的博客 339

零基础看懂数据库事务:从原理到实操,一文彻底搞懂

事务就是一组要么全部成功、要么全部失败的数据库操作。我们平时执行的单条SQL,比如查询数据、修改一条数据,都是单独操作。但很多业务场景,需要多条SQL必须捆绑执行,不能只成功一半,这一组捆绑的操作,就是一个事务。微信转账。A给B转账100元,这个业务必须包含两步数据库操作:A的账户余额 -100元B的账户余额 +100元试想一下:如果第一步执行成功,第二步突然断电、网络中断、程序崩溃,会发生什么?结果就是:A钱少了,B钱没多,数据彻底错乱,造成资金损失。

wwd_001的博客 172

spring针对一条数据同事操作_一文搞懂 Spring 数据库事务操作

作者 | 阿文,责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN(ID:CSDNnews)今天我们一起了解下Spring的数据库事务操作。在操作数据库时,我们经常会使用到事务,为此Spring 提供了专门的用于处理事务的API方便开发者调用,那么本文就着重来讲解下Spring 对于事务的相关功能。Spring 事务的核心接口Spring 通过一个名为spring-tx-4.3.6...

weixin_39797693的博客 106

spring针对一条数据同事操作_一文搞懂 Spring 数据库事务操作!

文章来源:https://mp.weixin.qq.com/s/VlNe2blmVpajsO0txvgQWg作者:阿文今天我们一起了解下Spring的数据库事务操作。在操作数据库时,我们经常会使用到事务,为此Spring 提供了专门的用于处理事务的API方便开发者调用,那么本文就着重来讲解下Spring 对于事务的相关功能。1.Spring 事务的核心接口Spring 通过一个名为spring-t...

weixin_39710361的博客 281

一文搞懂后端面试之数据库分布式事务【中间件 | 数据库 | MySQL | ACID】

重点:两阶段提交协议、三阶段提交协议和XA协议的基本步骤跨服务的分布式事务:TCC、SAGA、AT容错基本就是重试监控+告警+人工介入处理读数据+数据修复监控+告警+故障自动处理单纯的分库分表跨表事务,可以考虑延迟事务

LightOfNight的博客 1315

科普文:软件架构数据库系列之【一文搞懂MySQL中Innodb事务原理/ACID】

innodb通过日志文件(redo log 和 undo log)、锁技术以及MVCC(多版本并发控制)来实现事务的持久性、原子性、一致性和隔离性。

为无为,事无事,味无味。 1407

matlab实现六自由度火箭姿态控制仿真-航空航天-控制系统-PID-LQR-六自由度-火箭姿态仿真-matlab

内容概要:本文通过Matlab仿真平台深入研究六自由度火箭姿态控制。涵盖模型建立、控制系统设计(包括PID控制器和LQR控制器)、状态更新、反馈与迭代、仿真软件应用及验证分析等多个环节。此外,提供了详细的Matlab源码和运行步骤,使读者能重现并扩展仿真研究。适用人群:航空航天领域的研究人员、高校师生及具有一定Matlab编程基础的专业人士。使用场景及目标:该研究成果适用于航天工程项目中火箭姿态的精确控制研究,具体目标包括:构建精准的动力学模型;设计有效的控制算法,确保火箭按预期轨迹飞行;验证和改进现有控制系统性能。其他说明:仿真不仅有助于理论理解和算法验证,还可以为后续实测提供重要参考。文中还提到进一步的研究方向,比如更为复杂的气动力模型。

上一篇: MySQL索引详解
下一篇: 进程的初步认识
是布谷阿
博客等级 码龄4年 121粉丝 · 50原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是布谷阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值