(保姆级教程)Mysql中事务的概念,什么是事务,如何使用事务,以及事务的隔离级别,什么是脏读、幻读,代码演示

继续讲解 Mysql 数据库中最重要的一个概念:事务

文章目录

    • 事务
      • 1.1 什么是事务
      • 1.2 执行原理
      • 1.3 如何操作事务
      • 1.4 事务的特点(ACID原则)
      • 1.5 事务并发
      • 1.6 事务隔离级别
        • 1.6.1 事务并发问题操作演示
        • 1.6.2 脏读演示
        • 1.6.3 不可重复读演示
        • 1.6.4 幻读演示

事务

1.1 什么是事务

1、事务是构成多用户使用数据库的基础。

2、举个例子来理解事务:

例子:向公司添加一名新的员工,这个过程大致分为这三步:在数据库中创建一条新的记录 ----> 为新员工添加部门 ----> 建立他的工资和奖金记录。

如果这 3 步中任何一步失败,则系统就必须撤销在此之前所有的变化,删除所有不完整记录的痕迹。这 3 个任务就构成了一个事务,其中任何一个任务的失败都会导致整个事务被撤销。

3、事务:是原子操作,是一个最小执行单元,由一个或多个 SQL 语句组成。这个单元中的每个 SQL 语句是相互依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。

4、简单总结事务的定义:

  • 一个数据库操作序列
  • 一个不可分割的工作单位
  • 恢复和并发控制的基本单位

事务和程序的比较:

  • 在关系数据库中,一个事务可以是一条或多条 SQL 语句,也可以包含一个或多个程序。
  • 一个程序通常包含多个事务。

1.2 执行原理

1、数据库会为每一个客户端都维护 一个独立空间的缓存区(回滚段)

2、一个事务中所有的 增删改 语句的执行结果会先缓存在回滚段中,而不是持久化到数据库中(查询不存在事务,不影响)

  • 成功:当事务中所有 SQL 语句均正常结束(commit),才会将回滚段中的数据同步到数据库。
  • 失败:整个事务将回滚(rollback)

1.3 如何操作事务

1、默认情况下事务是自动提交的(比如:你写一个 SQL 语句,在没有开始事务的情况下,就默认提交了,假如后面 SQL 语句有问题,前面的需要回滚,但是你已经提交了,就回滚不了了,所以这样不行)

事务开始:设置事务为手动提交set autocommit=0; 0 表示手动提交,1 表示自动提交

事务结束:分为两种情况:

  • 提交事务,事务就结束了,命令为:commit;
  • 回滚事务,事务也结束了,命令为:rollback;

2、未来在 java 代码中的操作

try{执行事务//上面没报错就提交事务   提交事务
} catch() {回滚事务
}

1.4 事务的特点(ACID原则)

原子性(Atomicity):表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

一致性(Consistency):表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态。

隔离性(Isolation):指一个事务的操作不能影响到另外一个事务的执行。

持久性(Durability):指即使系统崩溃,一个提交的事务仍然存在(也就是说:一个事务操作完成对数据库的影响是永久的)

1.5 事务并发

什么是事务并发:多个人(人:事务)同时操作同一个表中的数据。

带来的问题:

  • 脏读: 事务A读到了事务B未提交保存的数据。

    举例:比如账户里面有800块钱,此时事务A正常读。但是此时事务B给账户加了200块钱,事务A再读时,读到了1000块钱,但是现在事务B要回滚,这200块没有成功,但是事务A读到了,这不允许,因为事务A读取到了一个不存在的脏数据。

  • 不可重复读: 事务A在同一个事务中,因为事务B修改了数据,并提交了,同样的条件下,造成事务A两次读取到的数据不一致。

    例如:事务在 T1 时间读取到了某一行数据, 在 T2 时间重新读取这一行时候,这一行的数据已经发生修改,所以再次读取时得到了一个和 T1 查询时不同的结果。(因为中间有其他事务提交了 修改

  • 幻读: 事务A在同一个事务中,因为事务B新增了数据,并提交了,如果事务A修改数据, 会出现多修改了一条数据,出现幻觉。

    第一次和第二次读出来的记录数不一样。(因为中间有其他事务提交了 插入/删除

区别:

  • 不可重复读:重点是修改,读的数据不一样;
  • 幻读:重点是新增或者是修改,读的记录数不一样。

1.6 事务隔离级别

使用事务隔离级别来解决:读未提交: read uncommitted、读已提交: read committed、可重复读(mysql 默认的隔离级别): repeatable read、串行化: serializable

×:不能解决 √:能解决
脏读不可重复读幻读
读未提交×××
读已提交××
可重复读×
串行化

命令行查看事务隔离级别的时候报错:

原因:老版本 MySQL 比如 5 中用的是 tx_isolation,而应该是在 5.7.20 版本之后,用的是 transaction_isolation。 所以:在 MySQL 8 及之后的版本中,只需将语句中的 tx_isolation 替换为 transaction_isolation 即可:

每启动一个 MySQL 程序,就会获得一个单独的数据库连接

-- 查看当前的隔离级别
select @@transaction_isolation;
-- 设置当前mysql连接的隔离级别(session表示连接的当前窗口)
set session transaction isolation level 隔离级别的英文名称;
-- 设置数据库系统全局的隔离级别
set global transaction isolation level 隔离级别的英文名称;
1.6.1 事务并发问题操作演示

下面进行实际操作演示事务并发:由于 navicat 中无法演示不同事务,这里直接开两个 cmd 窗口来演示不同的事务。
在这里插入图片描述
事务并发操作的表为:
> ](https://img-blog.csdnimg.cn/a77cc1f714d24419b704818fd0824f29.png)

1.6.2 脏读演示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个问题的演示都要设置为手动提交:每个事务都需要。

但是设置隔离级别,这里只设置了出现问题的事务(比如:事务A,最好每个事务也设置下)


在这里插入图片描述

这也出现了另外一个问题,同一个事务内,事务A三次读取的数据不一样,导致不可重复读

怎么解决脏读? 设置隔离级别:读已提交:read committed(这里只给事务A设置了隔离,也可以给B设置同样的隔离级别)

在这里插入图片描述

1.6.3 不可重复读演示

在这里插入图片描述

解决: 设置隔离级别:可重复读 repeatable read

在这里插入图片描述

1.6.4 幻读演示

在这里插入图片描述

注意:幻读在实际开发中是可以接收的

解决: 设置隔离级别:serializable。一般不用解决

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人机交互模块的发展

人机交互(Human-Computer Interaction,HCI)是指人与计算机之间进行交互和信息交换的过程。人机交互模块的发展经历了多个阶段,从早期的命令行界面到现在多样化的交互方式,不断发展和创新。以下是一些人机交互模块的发展…

[Linux] 冯诺依曼体系结构 与 操作系统

文章目录 1、冯诺依曼体系结构2、操作系统 1、冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相…

性能优化中使用Profiler进行页面卡顿的排查及解决方式

文章目录 一、前言二、页面卡顿的排查方式1、耗时操作的监控2、页面卡顿的监控 三、参考链接 一、前言 程序的优化在做过线上bug处理,布局层级优化,项目依赖库版本更新,重复库合并,删除未使用的资源,删除冗余的库&…

给sprite上增加刷光动效

游戏引擎 —— cocos creator 3.52 此动效给动态修改尺寸的图片增加一层刷光的效果,直接贴代码 CCEffect %{techniques:- passes:- vert: sprite-vs:vertfrag: sprite-fs:fragdepthStencilState:depthTest: falsedepthWrite: falseblendState:targets:- blend: tr…

hive return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误,大家觉得应该怎么办?从哪方面入手呢? 1.百…

Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案自己写的HLS图像缩放方案 3、设计思路详解Video Processing Subsystem 介绍 4、工程代码详解PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项…

时间敏感网络TSN的车载设计实践: 802.1Qbv协议

▎概述 IEEE 802.1Qbv[1]是TSN系列协议中备受关注的技术之一,如图1所示,它定义了一种时间感知整形器(Time Aware Shaper,TAS),支持Qbv协议的交换机可以按照配置好的门控列表来打开/关闭交换机出口队列&…

【Web】NewStarCtf Week2 个人复现

目录 ①游戏高手 ②include 0。0 ③ez_sql ④Unserialize? ⑤Upload again! ⑥ R!!C!!E!! ①游戏高手 经典前端js小游戏 检索与分数相关的变量 控制台直接修改分数拿到flag ②include 0。0 禁了base64和rot13 尝试过包含/var/log/apache/access.log,ph…

如何进行MySQL的主从复制(MySQL5.7)

背景:在一些Web服务器开发中,系统用户在进行数据访问时,基本都是直接操作数据库MySQL进行访问,而这种情况下,若只有一台MySQL服务器,可能会存在如下问题 数据的读和写的所有压力都会由一台数据库独…

合封芯片未来趋势如何?合封优势能否体现?

芯片已经成为现代电子设备的核心组件。为了提高系统的性能、稳定性和功耗效率,一种先进的芯片封装技术——合封芯片应运而生。 合封芯片作为一种先进的芯片封装技术,合封芯片是一种将多个芯片(多样选择)或不同的功能的电子元器件…

输入4个整数,找出其中最大的数。用函数的嵌套调用来处理

目录 1解题思路: 2运行代码: 3运行结果: 4总结: 函数 定义函数 实例 函数声明 调用函数 实例 函数参数 1解题思路: 这个问题并不复杂,完全可以利用一个主函数就可以得到结果。现在根据题目要求,用函数的嵌套调用来处理。…

“关爱零距离.情暖老人心”主题活动

为提高社区老年人的生活质量,促进邻里间的互动与友谊,以及弘扬尊老爱幼的社区精神,11月21日山东省潍坊市金阳公益服务中心、重庆市潼南区同悦社会工作服务中心在潼南区桂林街道东风社区共同在潼南区桂林街道东风社区举办了“关爱零距离.情暖老…