(保姆级教程)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.mfbz.cn/a/182512.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Arrays.Sort并定制Comparator排序解决合并区间

合并区间-力扣算法题56题 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入&am…

新手必看!!附源码!!STM32通用定时器-比较输出PWM

一、什么是PWM? PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

PHP 语法||PHP 变量

PHP 脚本在服务器上执行&#xff0c;然后将纯 HTML 结果发送回浏览器。 基本的 PHP 语法 PHP 脚本可以放在文档中的任何位置。 PHP 脚本以 <?php 开始&#xff0c;以 ?> 结束&#xff1a; <?php // PHP 代码 ?> 值得一提的是&#xff0c;通过设定php.ini的相…

Spring配置其他注解Spring注解的解析原理

Spring配置其他注解 Primary注解用于标注相同类型的Bean优先被使用权&#xff0c;Primary是Spring 3.0引入的&#xff0c;与Component和Bean一起使用&#xff0c;标注该Bean的优先级更高&#xff0c;则在通过类型获取Bean或通过Autowired根据类型进行注入时&#xff0c;会选用优…

什么是数据确权?

在数字化时代&#xff0c;数据已经成为一种新型资产&#xff0c;”新的石油“&#xff0c;具有巨大的价值&#xff0c;未来世界经济竞争一定程度上是数字经济的竞争&#xff0c;而非工业的竞争。数据相关法律制度&#xff0c;尚且还不完整&#xff0c;推动数字经济的发展&#…

YOLOv8训练自己的目标检测数据集

YOLOv8训练自己的目标检测数据集 目录标题 源码下载环境配置安装包训练自己的数据集数据集文件格式数据集文件配置超参数文件配置训练数据集命令行训练脚本.py文件训练 进行detect显示detect的效果 源码下载 YOLOv8官方的GitHub代码&#xff0c;同时上面也有基础环境的配置要…

VOC数据集和COCO数据集直接的相互转换

VOC数据集格式 get_list.py import os import random import shutil# 设置随机种子 random.seed(1000)# 判断Annotations和JpegImages是否对应 train_precent=0.8 label_path= "../../Annotations" print(os.path.abspath(label_path)) save="../Main" pr…

前端工程、静态代码、Html页面 打包成nginx 的 docker镜像

1. 创建一个 mynginx的目录 2. 将前端代码文件夹&#xff08;比如叫 front &#xff09;复制到 mynginx 目录下 3. 在mynginx 目录下创建一个名为Dockerfile 的文件&#xff08;文件名不要改&#xff09;&#xff0c;文件内容如下&#xff1a; # 使用官方的 Nginx 镜像作为基…

深度学习图像分类算法研究与实现 - 卷积神经网络图像分类 计算机竞赛

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

shell 脚本的函数和数组

函数 —— 封装的一个公式&#xff1a;sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块&#xff0c;在函数中写执行的命令即可&#xff1b;使用函数可以避免代码重复&#xff0c;增加可读性&#xff0c;简化脚本&#xff0c;使用函数可以将大的工程分割为若…

教育数字化转型:塑造未来学习新范式

在国家教育数字化战略行动指引下&#xff0c;我国正积极推动数字化赋能教育高质量发展&#xff0c;以塑造教育发展的新优势。如今&#xff0c;随着科技新基建的普及和数字化赋能教育的深入推进&#xff0c;未来的教育模型正在逐渐形成。 在新的教育模型中&#xff0c;数字化学…

【python海洋专题四十七】风速的风羽图

【python海洋专题四十七】风速的风羽图 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Pyth…

在一个页面里向两张表里插入内容时,有一些复杂的BUG简单化

向两张表里插入内容时&#xff0c;有一些复杂的BUG简单化 当在第一张表里的页面操作&#xff0c;在第一张表查询结果的页面进行编辑&#xff0c;在编辑的时候需要对第二张表里和第一张表都保存内容&#xff0c;而且插入之后两张表的id关联着&#xff0c;这个时候这张表的id就不…

IntelliJ IDEA 16创建Web项目

首先要理解一个概念&#xff1a;在IntelliJ IDEA中“new Project”相当于eclipse中的工作空间&#xff08;Workspace&#xff09;&#xff0c;而“new Module”相当于eclipse中的工程&#xff08;Project&#xff09;。以下均采用Intellij的说法&#xff0c;请自行对照转换理解…

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份&#xff1a;");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…

Using PeopleCode in Application Engine Programs在应用引擎程序中使用PeopleCode

This section provides an overview of PeopleCode and Application Engine programs and discusses how to: 本节概述了PeopleCode和应用程序引擎程序&#xff0c;并讨论了如何: Decide when to use PeopleCode.决定何时使用PeopleCode。Consider the program environment.考…

队列的实现和OJ练习(c语言)

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法&#xff1f; 初始化队列 小提示&#xff1a; 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

git clone -mirror 和 git clone 的区别

目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统&#xff0c;通过Git可以方便地管理代码的版本和协作开发。在使用Git时&#xff0c;常见的操作之一就是通过git clone命令将远程仓库克隆…

SHAP - 机器学习模型可解释性工具

github地址&#xff1a;shap/docs/index.rst at master shap/shap (github.com) SHAP使用文档&#xff1a;欢迎使用 SHAP 文档 — SHAP 最新文档 SHAP介绍 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一种用于解释预测结果的方法&#xff0c;它基于Shapley…

好的程序员有什么特质呢?

程序员想要提升自己&#xff0c;一定要关注到工作中的方方面面。而一个好的程序员&#xff0c;一般都有这些特质&#xff1a; 弱者抱怨环境&#xff0c;强者改变环境 不要试图通过抱怨环境来获得工作环境上的改变&#xff0c;这不仅不会给你带来任何实质性的改变&#xff0c;…
最新文章