【Mysql】事物处理(TransAction Processing)

news2025/2/28 5:28:50

 

  • 博主简介:想进大厂的打工人
  • 博主主页:@xyk:
  • 所属专栏: JavaEE初阶

最近在复习mysql,复习到了mysql事物处理(TransAction),帮自己回顾一下,如果你也想了解什么是mysql的事物处理,希望这篇文章会对你有帮助!!!正文开始:


目录

文章目录

一、事物的概念

二、为什么使用事物?

🤷‍♂️2.1 那么应该怎么解决呢?

 三、事物的四个特性(八股文)

四、事物的使用步骤

五、并发执行事物可能产生的问题 

🎆5.1 脏读问题

🎶5.2 不可重复读

🎇5.3幻读

六、事物的隔离级别


一、事物的概念

🤷‍♀️什么是事物?

事务指逻辑上的一组操作,组成这组操作的各个单元,通俗来说,要么全部成功,要么全部失败。 

事务就是由单独单元的一个或多个sql语句组成,在这个单元中,每个sql语句都是相互依赖的。 

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

就是说如果单元中某条sql语句一旦执行失败或者产生错误,那么整个单元将会回滚(返回最初状态)。所有受到影响的数据将返回到事务开始之前的状态,但是如果单元中的所有sql语句都执行成功的话,那么该事务也就被顺利执行。

二、为什么使用事物?

首先准备一个测试表:

drop table if exists accout;
create table accout(
    id int primary key auto_increment,
    name varchar(20) comment '账户名称',
    money decimal(11,2) comment '金额'
);

insert into accout(name, money) values
('阿里巴巴', 5000),
('四十大盗', 1000);

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上就没有了增加的金额。

🤷‍♂️2.1 那么应该怎么解决呢?

事物就是为了解决上述问题~~

事物的本质就是把多个sql语句给打包成一个整体,要么全部执行成功,要么就一个都不执行;

而不会出现”执行一半“这样的中间状态!!!

🥰一个整体就是所谓的原子性(atom)认为是事物能够分割的最小单位~~

不是真的没执行,而是”看起来好像没执行一样“

执行了,执行一半出错了,出错之后,选择了恢复现场,把数据还原成未执行之前的状态了~~

这个恢复数据的操作,称为”回滚“(rollback)

如果把上述俩个操作作为一个事物,当第一个sql执行完之后,数据库崩溃;

当下次数据重新启动完成之后,就会自动的把上次修改一半的数据给进行还原~~

此处是需要额外的部分来记录事物中的操作步骤,进行回滚的时候,数据库里面有个专门来记录事物的日志;

正因为如此,使用事物的时候,执行sql的开销是更大的,效率是更低!!!

 三、事物的四个特性(八股文)

  • 原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况。(最核心的特性)
  • 一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态。数据要靠谱!!
  • 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,内容是写在硬盘上的,接下来的其他操作或故障不应对其有任何影响。
  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

事物的隔离性,存在的意义就是为了在 数据库并发处理事物的时候不会有问题!!

四、事物的使用步骤

😉(1)开启事务:start transaction;
😮(2)执行多条SQL语句
🤐(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

假设数据库中已经有表存在:

#步骤一:开启事务(可选)
start transaction;

#步骤二:编写事务中的sql语句(insert、update、delete)
#这里实现一下"李二给王五转账"的事务过程
update t_account set balance = 50 where vname = "李二";
update t_account set balance = 130 where vname = "王五";

#步骤三:结束事务
commit; #提交事务
# rollback; #回滚事务:就是事务不执行,回滚到事务执行前的状态

运行结果:

五、并发执行事物可能产生的问题 

🎆5.1 脏读问题

假设老师在写代码,在写代码的过程中,有一个同学,在老师身后经过;偷偷的瞄了一眼屏幕,看到了代码中的一些内容,然后他就走了;

🤦‍♀️那么很可能,他走了之后,老师的代码,又改了!!

此时读操作就称作为"脏读”,读到的数据也称为“脏数据”,脏的意思, 是“无效”,而不是“埋汰”~~

为了解决脏读问题,mysql引入“写操作加锁”这样的机制,老师和同学们约定好,写操作的过程中,同学不许来看,等老师改完,提交到码云上,再通过码云来看!!

写的过程不能看(给写操作加锁),写完了才能看!!

这就意味着,同学的“读操作”和老师的“写操作”不能并发了~~

这个写操作加锁,就降低了并发程度(降低了效率),提高了隔离性(提高了数据的准确性)

🎶5.2 不可重复读

还是老师写代码,同学想看;于是就约定好,写的时候不许看,等提交了再一起看~~

于是老师提交了版本1,此时就有同学来读这个代码了~~

于是老师又打开代码,继续修改代码,然后又提交版本2~~

😢同学在开始读的过程中,读到的是版本1的代码,读着读着,老师提交了版本2,此时这个同学读的代码,刷的一下就变样了!!

这个问题就叫“不可重复读”~~

事务1已经提交了数据.此时事务2开始去读取数据.在读取过程中,事务3又提交了新的数据.
此时意味着同一个事务2之内,多次读数据,读出来的结果是不相同的~~(预期是一个事务中,多次读取结果得一样)就叫做“不可重复读”

刚才的约定是,修改的时候,同学不要读,是给写加锁;

现在约定同学读的时候,老师不能修改,就是给读加锁!!

这个读加锁,又进一步的降低了事物的并发处理能力(处理交流也降低),提高了事物的隔离性(数据的准确性又提高了)

🎇5.3幻读

当前已经约定了读加锁和写加锁,解决了不可重复读和脏读问题.


由于约定了读加锁,同学读的时候,老师不能改代码了~~老师在这干的等着??光摸鱼不干活~~有点难受~~

🤦‍♂️所以老师想了办法~~同学读Student.java,那好,我就创建一个Teacher.java,就写这个代码呗~~
这样的情况,大多数情况下都没事,少数情况下,个别同学发现了,读代码读着突然冒出个Teacher.java,有的同学就觉得接收不了了~~


在读加锁和写加锁的前提下,一个事务两次读取同一个数据,发现读取的数据值是一样的,但是结果集不一样~~
(Student.java代码内容不变,但是第一次看到的是只有Studentjava这个文件,第二次看到的是Studentjava和Teacher.java 了...)

这种就称为"幻读"

数据库使用“串行化”这样的方式来解决幻读,彻底放弃并发处理事物,一个接一个的串行的处理事物,这样做,并发程度是最低的(效率是最慢的),隔离性是最高的(准确性也是最高的)!!

六、事物的隔离级别

mysql中的四种事务隔离级别如下:

🙂1. read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更。(脏读、不可重复读和幻读的问题都会出现)。
🆒2. read committed(读已提交数据):只允许事务读取已经被其他事务提交的变更。(可以避免脏读,但不可重复读和幻读的问题仍然可能出现)
😶‍🌫️3.repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。(可以避免脏读和不可重复读,但幻读仍然存在)
😎4. serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可避免,但性能十分低下(因为你不完成就都不可以弄,效率太低)

一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性就越差。

#设置当前mysql连接的隔离级别:
set session transaction isolation level read uncommitted;
#设置数据库系统的全局的隔离级别:
set global transaction isolation level read uncommitted;

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

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

相关文章

【SQL Server】无需公网IP,就可以远程连接SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…

基于html+css的自适应展示3

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

MySQL--库的操作--校验规则对于数据库的影响--0409

目录 1.库的基础操作 查看数据库 创建数据库 删除数据库 查看建库语句 修改数据库 2.字符集和字符集校验规则 2.1 查看系统默认字符集以及校验规则 2.2 使用特定的字符集创建数据库 2.3 不同校验规则对数据库的影响 2.3.1 大小写验证 2.3.2 排序验证 3.备份和恢复 3.1…

开启单细胞及空间组学行业发展黄金时代!首届国际单细胞及空间组学大会在穗闭幕

2023年4月16日,首届TICSSO国际单细胞及空间组学大会圆满闭幕,本次大会吸引了2000余位来自产、学、研、资、医、政、媒等业界人士齐聚羊城,注册总人数5398人,网络播放总量达548245人次,网络观看覆盖美国、德国、日本、澳…

Vue语法糖<script setup>详解,用最快的方式让你看懂和<script>的区别

前言 Vue3出来已经3年了&#xff0c;但是前两天在百度上搜索有关setup语法糖的细节时&#xff0c;发现很多博客关于语法糖细节部分&#xff0c;还是讲的很粗糙&#xff0c;因此决定自己来写一篇入门的博客&#xff0c;方便大家快速上手。 <script setup>简介 它是Vue3…

关于ASP.NET MVC与.NET CORE 的区别--小结

简述关于ASP.NET MVC与.NET CORE的区别 1、关于ASP.NET 关于MVC 刚开始接触这个技术的时候我经常不理解他们的名字&#xff0c;我相信许多学ASP.NET开发人员开始接触MVC应该也和我一样产生很多为什么&#xff0c;也会误认为认为MVC与ASP.NET完全没有关系&#xff0c;是一个全新…

基于ssm+vue的学生实习过程管理系统

基于ssmvue的学生实习过程管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍…

Kotlin与H5通信的实现方式

Kotlin与H5通信1、H5中主动的调用Kotlin中的程序1编写后端程序并且在服务器上运行2准备好AndroidStudio的界面布局中的WebView3编写工具类用来处理H5调用逻辑4通过addJavascriptInterface来构建桥梁5结果展示2在Kotlin中调用H5的程序1在H5中编写方法&#xff0c;来处理Kotlin的…

【C】Operator / Expression

系列连载 【python / C / C】 参考 《C语言程序设计&#xff08;第四版&#xff09;谭浩强》【C语言】C语言视频教程《郝斌 C 语言自学教程》 文章目录1 运算符1.1 基本的算术运算符2 表达式1 运算符 1.1 基本的算术运算符 注意&#xff0c; 是右结合的 “” 具有左结合性&…

C++ 面向对象、多继承

// Student.hclass Student { private: // 私有的&#xff0c;外界不能访问char *name;int age;public:void setAge(int age);void setName(char* name);int getAge();char* getName();// 空参构造函数Student(){}// 一参构造函数Student(char* name) : Student(name,80) {// 调…

干翻Hadoop系列:MapReduce详解

第一章&#xff1a;MapReduce原理 数据存储在分布式文件系统中HDFS里边&#xff0c;通过使用Hadoop资源管理系统YARN&#xff0c;Hadoop可以将MapReduce计算&#xff0c;转移到有存储部分的数据的各台机器上。 一&#xff1a;概念和原理 1&#xff1a;MapReduce作业 MapRed…

【机器学习】P16 激活函数 Activation Function

对于激活函数&#xff08;Activation Function&#xff09;&#xff0c;存在两个问题&#xff1a; 为什么要用激活函数&#xff1f;如何选择用哪种激活函数&#xff1f;如何使用激活函数&#xff1f; 本博文将围绕这两个问题&#xff0c;首先介绍激活函数的作用&#xff0c;从…

2023腾讯云轻量应用服务器性能评测

腾讯云轻量应用服务器性能如何&#xff1f;CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;相对于CVM云服务器轻量服务器更适合轻量级的应用&#xff0c;轻量服务适合中小企或个人开发者用于搭建We网站b应用…

利用Python生成和识读二维码(QR Code)和微二维码(Micro QR Code)

目录一、环境准备二、二维码&#xff08;QR Code&#xff09;生成和读取2.1 生成二维码2.2 读取二维码三、微二维码&#xff08;Micro QR Code&#xff09;生成和读取3.1 生成微二维码3.2 读取微二维码之前写的一篇 博客采用了segno库来做微二维码的生成&#xff0c;该库可以方…

AD9689 input clock not detect

在项目调试中&#xff0c;遇到的问题&#xff0c;在ADI论坛上发帖咨询&#xff0c;转发到这里。网址如下&#xff1a; AD9689 input clock not detect - Q&A - High-Speed ADCs - EngineerZone (analog.com) Our FPGA board has two AD9689&#xff0c;one works ok, but…

使用Marshaller 将Java对象转化为XML格式和字符串转为xml

使用Marshaller 将Java对象转化为XML格式 对象转xml内容 ①工具类 public static String convertObjectToXml(Object obj) throws Exception {StringWriter writer new StringWriter();// 创建 JAXBContext 和 MarshallerJAXBContext context JAXBContext.newInstance(obj.ge…

MySQL客观题

MySQL客观题 在数据库的三级模式结构中&#xff0c;描述数据库中全体数据的全局逻辑结构和特性的是&#xff08; A &#xff09; A 模式 B 内模式 C 存储模式 D 外模式 数据库系统的特点是&#xff08; A &#xff09;、数据独立、减少数据冗余、避免数据不一致和加强了数据保…

自定义jar项目上传到Maven中央仓库/maven仓库/阿里云效仓库

1.前言 如何把自己的项目Jar或者Starter上传到Maven中央仓库中。 2.https://issues.sonatype.org/注册账号 3.注册成功 登录新建项目 摘要随意填写 重点来了 groupId 如果有自己域名的就自己域名com.xxx 如果用的gitee那么填写com.gitee.自己gitee的用户名 projectUrl&…

ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7

编辑&#xff1a;ll ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7 型号&#xff1a;AD8603AUJZ-REEL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOT-23-5 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;5 类型&#xff1…

WOT全球技术创新大会2023整装待发,一起去见证科技的力量

从2012年开始&#xff0c;51CTO已经连续11年、累计奉献了19场WOT全球技术创新大会。 11年时间&#xff0c;有的技术如神话般崛起又泡沫般消失&#xff1b;有的技术历经时光磨砺而愈发彰显价值&#xff1b;有的技术充满争议而争议还在继续。 为什么我们会持续策划、举办WOT&am…