(保姆级教程)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.mzph.cn/news/165026.shtml

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

相关文章

二叉树的顺序结构及实现

目录 1 二叉树的顺序结构2. 堆的概念及结构3 .堆的实现(小堆) 1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,…

【Pytorch】Visualization of Feature Maps(3)

学习参考来自: Image Style Transform–关于图像风格迁移的介绍github:https://github.com/wmn7/ML_Practice/tree/master/2019_06_03 文章目录 风格迁移 风格迁移 风格迁移出处: 《A Neural Algorithm of Artistic Style》(ar…

浏览器没收到返回,后端也没报错,php的json_encode问题bug

今天网站遇到个问题,后端返回异常,但是浏览器状态码200,但是看不到结果。经过排查发现,我们在返回结果的时候使用了json_encode返回给前端,结果里面的字符编码异常,导致json_encode异常,但是php…

前缀和——724. 寻找数组的中心下标

文章目录 🍓1. 题目🫒2. 算法原理🦄解法一:暴力枚举🦄解法二:前缀和 🥔3. 代码实现 🍓1. 题目 题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode&#xff0…

【限时免费】20天拿下华为OD笔试之【前缀和】2023B-数字游戏【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出 示例二输入输出说明 解题思路前缀和简单的数学推导哈希集合的使用 代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 小明玩一个游戏。 系统发1n张牌&#xff…

某60区块链安全之未初始化的存储指针实战一学习记录

区块链安全 文章目录 区块链安全未初始化的存储指针实战一实验目的实验环境实验工具实验原理实验过程 未初始化的存储指针实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubuntu18.04操…

深度学习之八(生成对抗网络--Generative Adversarial Networks,GANs)

概念 生成对抗网络(Generative Adversarial Networks, GANs)是一种深度学习模型,由 Ian Goodfellow 等人于2014年提出。GAN 的目标是通过训练两个神经网络(生成器和判别器),使得生成器能够生成与真实数据相似的样本,而判别器能够区分真实样本和生成样本。这两个网络相…

多元逻辑回归模型的概念、模型检验以及应用

多元逻辑回归是逻辑回归的一种扩展,用于处理多类别分类问题。在二元逻辑回归中,我们通过一个逻辑函数(也称为S形函数)将输入特征映射到一个概率值,用于预测两个类别中一个的概率。而在多元逻辑回归中,我们面…

沃趣班11月月考题目解析

沃趣班11月月考题目解析 1.在oracle中创建用户时,若未设置default tablespace关键字,则oracle将哪个表空间分配给用户作为默认表空间 答案:D.user SQL> create user mytest identified by 123456; SQL> grant connect to mytest; SQL…

【开源】基于Vue.js的海南旅游景点推荐系统的设计和实现

项目编号: S 023 ,文末获取源码。 \color{red}{项目编号:S023,文末获取源码。} 项目编号:S023,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四…

CSS特效017:球体涨水的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

前端错误处理与调试

** javascript错误处理 ** 由于javascript本身是动态语言,而且没有固定的开发工具,因此他普遍认为是最难以调试的语言,在ECMAScript3新增了try-catch和throw以及一些错误类型,让开发人员能适当的处理错误,紧接着web浏…

多tab页表单校验如何做

多tab页表单校验如何做 在多tab页表单中进行校验,可以按照以下步骤进行: 创建一个表单对象,用于存储表单数据和校验规则。 分为多个tab页,每个tab页对应一个表单页面。 定义每个tab页中的表单字段及其相应的校验规则。 在切换…

PHP 赋值、算数和比较运算符 学习资料

PHP 赋值、算数和比较运算符 在 PHP 中,赋值、算数和比较运算符用于对变量进行赋值、进行数学运算和比较操作。以下是对这些运算符的介绍和示例: 赋值运算符 赋值运算符用于给变量赋值。常用的赋值运算符有 、、-、*、/ 等。 示例: $a …

芯能转债上市价格预测

芯能转债-113679 基本信息 转债名称:芯能转债,评级:AA-,发行规模:8.8亿元。 正股名称:芯能科技,今日收盘价:12.63元,转股价格:13.1元。 当前转股价值 转债面…

基于遗传优化的多属性判决5G-Wifi网络切换算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................................... %接收功率、网…

数字孪生智慧校园 Web 3D 可视化监测

当今,智慧校园发展阶段亟需推动信息可视化建设与发展,将大数据、云计算、可视化等高新技术相融合,为校园师生创造科学智能的学习环境,并实现教学资源最大化和信息服务智能化。帮助学校更好地应用校园可视化技术,提升校…

原型模式 (Prototype Pattern)

定义: 原型模式(Prototype Pattern)是一种创建型设计模式,它用于创建重复的对象,同时保持性能。这种模式的核心思想是通过复制一个已存在的实例来创建新的实例,而不是新建实例并对其进行初始化。原型模式适…

jetson xavier NX深度学习环境配置

文章目录 jetson xavier NX深度学习环境配置1. SD卡系统烧录1.1 材料1.2 软件配置1.3 格式化SD卡1.4 系统镜像烧录 2. 环境配置2.1 cuda环境配置2.2 安装依赖库2.3 安装python及依赖环境2.4 安装pytorch环境 jetson xavier NX深度学习环境配置 1. SD卡系统烧录 1.1 材料 SD …

面试题 —— 前端精选(1)

文章目录 前言 阐述 JS 的事件循环 JS 中的计时器能做到精确计时吗?为什么? 如何理解 JS 的异步? 前言 本文章介绍三道围绕 JavaScript 的精选面试题 阐述 JS 的事件循环 事件循环⼜叫做消息循环,是浏览器渲染主线程的⼯作⽅式…