当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL事务管理的作用详解

MySQL事务管理的作用详解

来源:脚本之家 2022-12-31 11:37:57 0浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《MySQL事务管理的作用详解》,介绍一下MySQL事务管理,希望对大家的知识积累有所帮助,助力实战开发!

1.为何使用事务管理

可以保证数据的完整性。事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。

例子: 转账为例。

金庸向张无忌转账1000元。----在数据库中修改两个账号的余额。

发生意外情况,则出现金庸减钱成功,而张无忌加钱失败。 如何解决?

使用事务进行解决,此时代码执行后金庸的钱没有减,张无忌的钱也没有加

2.数据库事务的原理

如果不写begin;commit;此时事务默认自动开启,自动提交; 在数据库中 ,事务都是自动提交的。事务的自动提交就是 执行sql语句完成之后 就立刻持久化到数据库中。

begin;开始事务

rollback;回滚事务

commit;提交事务

当我们添加了begin;和commit;后 事务的提交就从自动变成手动。因为中途出错,所以导致 commit;不执行,也就是说缓冲区中的数据没有到持久化 的数据库中 。

public class Test {
    public static void main(String[] args) {
        Connection connection =null;
            try {
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    connection= DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai",
                     "root","123456");
                    connection.setAutoCommit(false);//开启事务的手动提交
                 String sql = "update tb_emp set salary=salary-1000 where name='金庸'";
                    PreparedStatement ps =connection.prepareStatement(sql);
                    ps.executeUpdate();
                String sql1 = "update tb_emp setsalary=salary+1000 where name='张无忌'";
                    ps = connection.prepareStatement(sql1);
                    ps.executeUpdate();
                    connection.commit();//提交事务
                }catch (Exception e){
                    try {
                         connection.rollback();//事务回滚 最初的状态
                        } catch (SQLException throwables) {
                            throwables.printStackTrace();
                         }
                        e.printStackTrace();
                        }finally{
                                }
               }
            }

3.什么是事务

从开启到提交为一个事务。 由此可见,一个事务对应一组业务。一个事务中间可以有一条sql,多条sql。 所以 一个业务开始之前 开启事务 一个业务 结束之后 提交事务。 我们这个转账案例:需要几个事务? 可以写成两个事务,但是不合适。因为我们的需求 让金庸减的同时让张无忌加钱。只能写 成一个事 务。 把多条sql语句当作一件事情,要同时都能执行到。

事务(Transaction),一般是指要做的或所做的事情。在计算机术语 中是指访问并可能更新数据库中各种数据项的一个程序执行单元 (unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或 Java)书写的用户程序的执行所引起,并用形如begin transaction和 end transaction语句(或函数调用)来界定。事务由事务开始 (begin transaction)和事务结束(end transaction)之间执行的全体 操作组成。

概括为: 事务是由一些列动作组成,这些动作要么都执行,要么都不执行。

3.1 事务的特性ACID

1、原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间 环节。事务执行过程中 出错,会回滚到事务开始前的状态,所有的操作就 像没有发生一样。也就是说事务是一个不可分 割的整体,就像化学中学过 的原子,是物质构成的基本单位。

2、一致性(Consistency): 事务开始前和结束后,数据库的数据完整性约束没有被破坏,事务前后操 作数据是一致的 。比如 A向B转账,不可能A扣了钱,B却没收到。 能量守恒。

3、隔离性(Isolation): 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数 据对并发的其他事务是 隔离的,并发执行的各个事务之间不能互相干扰。 比如A正在从一张银行卡中取钱,在A取钱的过 程结束前,B不能向这张卡 转账。 两个事务之间是有隔离级别,隔离级别的不同会导致出现不同的问 题。此时产生三种读: 脏读 幻读 不可重复读。

4、持久性(Durability): 持久性(durability)。持久性也称永久性(permanence),指一个事务 一旦提交,它对数据库 中数据的改变就应该是永久性的。接下来的其他操 作或故障不应该对其有任何影响。

3.2 事务的并发问题

1、脏读:

事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

2、不可重复读

事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

3、幻读

已知有两个事务A和B,A从一个表中读取了数据,然后B在该表中插入了一些新数据,导致A再次读取同一个表,就会多出几行,简单的说,一个事务中先后读取一个范围的记录,但每次读取的记录数不同,称之为幻象读。

小结:不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除,解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

3.3 隔离级别

事务隔离性的等级:

查看事务的隔离等级:

语句:select @@global.transaction_isolation,@@transaction_isolation;

事务的隔离等级有四点,每种隔离等级有其会出现的情况

1.Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

2.Read Committed(读取提交内容 也叫做不可重复读)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

一个事务读某条数据读两遍,读到的是不一样的数据,也就是说,一个事务在进行中读取到了其他事务对旧数据的修改结果,(比如说 我开一个事务 修改某条数据 先查后改 执行修改动作的时候发现这条数据已经被别的事务删掉了)

3.Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

一个事务中,读取到了其他事务新增的数据,仿佛出现了幻象。(幻读与不可重复读类似,不可重复读是读到了其他事务update/delete的结果,幻读是读到了其他事务insert的结果)

4.Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

隔离级别越高,然后执行效率越低。

4.Spring事务管理

到这里,我们也就讲完了《MySQL事务管理的作用详解》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
MySQL 数据类型及最优选取规则MySQL 数据类型及最优选取规则
上一篇
MySQL 数据类型及最优选取规则
Mysql表连接的执行流程详解
下一篇
Mysql表连接的执行流程详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    16次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    25次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    42次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码