事务的学习

news2024/9/16 21:20:43

一、什么是事务

事务 是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销请求,这些操作要么同时成功,要么同时失败

一组操作集合,不可分割,一起向系统提交/撤销,要么同时成功,要么同时失败。

例子:

如果a向b转账100元,总共分为三个步骤
(1)检查a的手机余额是否>=100元
(1)a的手机账户钱扣掉100元
(2)b的手机账户增加100元

这三步过程合起来就是一个事务,一旦a的手机账户扣掉100元后,系统出现问题,那么b的手机账户就收不到100元,那么这100元究竟去了哪里,所以把这三步过程当作一个事务,一旦系统出现问题,那么就会将刚刚的扣钱操作撤销,也就是回滚事务,这样保证了要么一起成功,要么一起失败,不会出现100元不知道去哪了

为了解决这种问题,需要通过数据的事务来完成,业务开始时开启事务,执行完成后提交事务,一旦过程出现报错问题,就回滚事务,将数据恢复到原始状态。

你可要注意了,mysql中事务是自动提交的,执行一条语句,就会立刻提交事务。

二、事务的操作

好的下面我们就开始利用代码细致的分析一下事务操作

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);

在这里插入图片描述

正常操作

# 模拟使用三条语句构成一个事务
# 正常执行完张三1900元,李四2100元

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

-- 张三的余额减少100元
update account set money=money-100 where name='张三';

-- 李四的余额增加100元
update account set money=money+100 where name='李四';

在这里插入图片描述
恢复余额操作

-- 恢复金额
update account set money=2000 where name='张三' or name='李四';

异常操作

中间插入一句报错的语句

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

-- 张三的余额减少100元
update account set money=money-100 where name='张三';

出错误啦 你的语句出问题了
-- 李四的余额增加100元
update account set money=money+100 where name='李四';

最后卡在报错语句这个位置,余额增加的语句没有执行
在这里插入图片描述
继续回滚

-- 恢复金额
update account set money=2000 where name='张三' or name='李四';

上面的例子解决需要用到下面的方法:

控制事务1

  • 查看/设置事务提交方式
select @@autocommit;
set @@autocommit=0;
  • 提交事务
commit ;
  • 回滚事务
rollback ;

控制事务1方法修改了事务自动提交方式,改为手动提交,每次写完sql语句,需要执行commit进行一个手动的提交

利用控制事务1的方法:

-- 事务中出现报错
-- 控制事务1
-- 设置为手动提交
set @@autocommit=0;

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

-- 张三的余额减少100元
update account set money=money-100 where name='张三';

出错啦
-- 李四的余额增加100元
update account set money=money+100 where name='李四'

# 出错后进行回滚事务
rollback;

一旦卡在出错啦的位置,你不提交事务(commit),此时数据库中的数据不会变化,然后你执行rollback;进行回滚操作

-- 事务中没有报错
-- 控制事务1
-- 设置为手动提交
set @@autocommit=0;

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

-- 张三的余额减少100元
update account set money=money-100 where name='张三';

-- 李四的余额增加100元
update account set money=money+100 where name='李四';

commit ;

最后手动commit提交后,数据库中的数据张三余额才会变成1900,李四的余额变成2100

控制事务2

  • 开启事务
start transaction/begin;
  • 提交事务
commit ;

回滚事务

rollback;

利用控制事务2的方法:

-- 事务中出现报错
-- 开启事务
-- 控制事务2
-- 注意此时是自动提交(@@autocommit=1)
start transaction ;
-- 查询张三余额
select * from account where name='张三';

-- 张三的余额减少100元
update account set money=money-100 where name='张三';

出错啦
-- 李四的余额增加100元
update account set money=money+100 where name='李四';

-- 异常进行回滚事务
rollback ;

由于使用了start transaction来开启一个事务,所以必须要手动的commit来提交事务,否则数据库中的数据是不会发生变化的,如果事务内部出现错误,那么就可以使用rollback来进行回滚事务

-- 事务中没有报错
-- 开启事务
-- 控制事务2
-- 注意此时是自动提交(@@autocommit=1)
start transaction ;
-- 查询张三余额
select * from account where name='张三';

-- 张三的余额减少100元
update account set money=money-100 where name='张三';

-- 李四的余额增加100元
update account set money=money+100 where name='李四';

-- 正常提交事务
commit ;

三、事务的四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
    解释:类似与刚刚转账案例,三个步骤是一个整体,要么全部失败,要么全部成功,不会出现张三的余额减少100后发生报错,导致李四的余额也没有增加,这就导致二者钱的总数与原来不一样
  • 一致性(Consistency):事务完成时,必须使所有的数据保持一致状态。 解释:也就是转账三步骤完成后,二者总的钱是不变的
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 后面会细致解析
  • 持久性(Durability):事务一旦提交或回滚,对数据库中的数据改变时永久的
    解释:由于一旦提交或者回滚后,数据就真实存放到了电脑物理磁盘中,肯定数据改变是永久

四、并发事务问题

(1)脏读:一个事务读到另外一个事务没有提交的数据
解释:例如两个并发的事务a和b,其中事务A查完数据库中的一条记录后,事务a继续修改了一条记录,此时事务A并未提交,此时并发事务b读取了事务a修改的记录,这就导致事务b读取到事务a未提交的数据

(2)不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同
解释:例如两个并发事务a和b,其中事务a读取数据库中的一条记录后,事务b对数据库的这条记录进行修改后,提交事务b,此时事务a继续读取这条记录,发现和上次读取的数据不一样

(3)幻读:一个事务按照条件查询数据,没有对应的数据行,准备插入数据时,发现这行数据存在
解释:例如两个并发事务a和事务b,其中事务a读取了id=1的数据时,发现没有这条记录,然后事务b插入id=1的数据,并且提交了事务b,此时事务a准备插入id=1的数据时发现已经存在这条数据,因为插入数据时报错,显示有这条记录

五、事务隔离级别

(1)查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

(2)设置事务隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

事务隔离级别越高,数据越安全,性能越低

隔离界别脏读不可重复读幻读
read uncommitted不可避免不可避免不可避免
read committed可避免不可避免不可避免
repeatable read(默认)可避免可避免不可避免
Serializable可避免可避免可避免

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

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

相关文章

7.2 AQS原理

AQS 原理 概述 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。 特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和…

Clion 使用gdbserver调试FreeSWITCH源码

1.准备环境 window安装clion安装好gdb、ssh、已经编译好的freeswitch可执行文件的docker镜像2.配置clion Settings -> Tools ->SSH Configurations Settings-Build, Execution, Deployment-Toolchains(其实设不设置都行,用默认也行的) Settings-Build, Execution, Depl…

JVM内存配置错误导致的线上服务问题

1.现象 大量用户反映不能正常使用服务,导致用户无法进行下一步工作。 2.检查 因为是休息日,初步听到这个消息的时候怀疑是自己的锅。一是因为项目刚刚进行了重构;二是对MySQL数据进行了迁移,并且对待迁移的旧数据进行了数据分析…

【qt】如何读取文件并拆分信息?

需要用到QTextStream类 还有QFile类 对于文件的读取操作我们可以统一记下如下操作: 就这三板斧 获取到文件名用文件名初始化文件对象用文件对象初始化文本流 接下来就是打开文件了 用open()来打开文件 用readLine()来读取行数据 用atEnd()来判断是否读到结尾 用split()来获取…

LabVIEW中modbusTCP怎样才能和profibusDP通信?

在LabVIEW中,Modbus TCP和Profibus DP是两种不同的工业通信协议,要实现这两者之间的通信,可以采用网关设备进行协议转换,或者通过一个中间设备(如PLC)进行数据桥接。以下是实现此通信的一些方法&#xff1a…

王牌站士Ⅵ--人工智能集成商的崛起

前言 系统集成商 (SI) 具有独特的优势,可以利用 GenAI 的变革力量。通过综合各种数据并重新定义客户获取见解和采取行动的方式,SI 可以发展成为AI 集成商,彻底改变企业的运营方式和与技术的互动方式,当然,还可以保留长…

[人工智能]对未来建筑行业的影响

作者主页: 知孤云出岫 目录 引言1. 人工智能在建筑行业的应用场景1.1 设计阶段1.2 施工阶段1.3 运营和管理 2. 关键技术2.1 机器学习2.2 计算机视觉2.3 自然语言处理2.4 大数据分析 3. 实际案例分析3.1 案例1:利用GAN生成建筑设计方案3.2 案例2:利用计算…

在ROS中控制机器人运动

一、安装Arbotix 输入指令:sudo apt install ros-noetic-arbotix 找到下载的文件:roscore,roscd arbotix 安装好后,不需要按照教程里面的操作,复制进工作空间。 二、在config中建立配置文件,control.yaml # 该文件…

了解并缓解 IP 欺骗攻击

欺骗是黑客用来未经授权访问计算机或网络的一种网络攻击,IP 欺骗是其他欺骗方法中最常见的欺骗类型。通过 IP 欺骗,攻击者可以隐藏 IP 数据包的真实来源,使攻击来源难以知晓。一旦访问网络或设备/主机,网络犯罪分子通常会挖掘其中…

给 「大模型初学者」 的 LLaMA 3 核心技术剖析

编者按: 本文旨在带领读者深入了解 LLaMA 3 的核心技术 —— 使用 RMSNorm 进行预归一化、SwiGLU 激活函数、旋转编码(RoPE)和字节对编码(BPE)算法。RMSNorm 技术让模型能够识别文本中的重点,SwiGLU 激活函…

敏捷开发笔记(第10章节)--Liskov原则(LSP)

目录 1:PDF上传链接 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.6 启发式规则和习惯用法 10.7 结论 1:PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 OCP背后的主要机制是抽象(abstraction…

CSS【详解】边框 border,边框-圆角 border-radius,边框-填充 border-image,轮廓 outline

边框 border border 是以下三种边框样式的简写: border-width 边框宽度 —— 数值 px(像素),thin(细),medium(中等),thick(粗)border-style 边框线型 —— none【默认值…

数据库MySQL下载安装

MySQL下载安装地址如下: MySQL :: Download MySQL Community Server 1、下载界面 2、点击下载 3、解压记住目录 4、配置my.ini文件 未完..

整洁架构SOLID-里氏替换原则(LSP)

文章目录 定义LSP继承实践正例反例 LSP软件架构实践反例 小结 定义 1988年,Barbara Liskov在描述如何定义子类型时写下了这样一段话: 这里需要的是一种可替换性:如果对于每个类型是S的对象o1都存在一个类型为T的对象o2,能使操作T…

树莓派PICO使用INA226测量电流和总线电压(1)

TI的INA226是一款不错的16位电流测量芯片,拥有非常高的性价比,而且测量精度能够覆盖我们大多数的应用场景,INA226的接线也比较简单,通过I2C读取数据会稍微麻烦一点。 INA226可以在淘宝上直接买开发板,非常的便宜&#…

本地部署,去除动漫图像背景Anime Remove Background

目录 摘要 引言 深度学习在动漫角色中的应用 1.​U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果​ Tip: 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术,广泛应用于…

「Pytorch」roLabelImg 图像异常旋转 bug

在进行Yolo-obb 模型训练的时候需要标注旋转框,roLabelImg 是比较推荐的一款旋转框标注工具,既可以标注正常的矩形框,还可以标注旋转框 roLabelImg Github 地址:https://github.com/HumanSignal/labelImg 但是在使用过程中遇到了…

Word中使用LaTeX编辑公式

在日常学术写作过程中,公式输入必不可少。然而使用Word传统的公式编辑器往往无法满足高标准的排版要求,如排版不专业、编辑效率低、兼容性差等问题。LaTeX相比Word,在公式输入及排版方面更为强大,但是对于轻量级的任务&#xff0c…

Vivado 2020.1 HLS IP在BD模式无法生成问题

折腾了一周整整,记录一下,希望对大家有用。 各种找、各种操作,也问了FAE,都没搞定。 最后看到如下博文的方法3,管用。 vivado综合hls类ip核报错问题解决方案_vivado ip synth checkpoint mode-CSDN博客 报错描述 m…

Chatto企业AI助手产品技术拆解(上)

往期文章: AI智能客服项目拆解(1) 产品大纲 在上一篇文章中,我们详细介绍了AI智能客服的基本概念、需求分析、产品形态及分类,以及AI在线客服的用户体验流程和系统架构。为了更深入地理解AI智能客服的内在工作机制和技术实现,本…