【MySQL事务(上)】

news2024/9/17 4:24:58

文章目录

  • 前言
  • 一、什么是事务?
    • 1.关于事务的特性
  • 二、为什么要有事务
  • 三、事务的提交方式
    • 测试事务
      • 准备工作
      • 事务的操作
      • 1.启动事务
      • 2.对事务进行回滚(只有在事务进行期间)
      • 3.提交事务(持久化)
      • 4.事务的异常情况
      • 结论
  • 四、事务的隔离级别
    • 1.理解隔离性
    • 2.隔离级别
      • 1.读未提交【Read Uncommitted】
      • 2.读提交【Read Committed】
      • 3.可重复读【Repeatable Read】
      • 4.串行化【Serializable】
      • 5.查看与设置隔离级别
        • 查看隔离级别
        • 设置隔离级别
      • 读未提交的问题——脏读问题
      • 读提交的问题——不可重复读问题
      • 可重复读——幻读问题
      • 串行化——隔离级别最高的


前言

会话事务隔离级别的英文单词:

  • session Transactional isolation level
  • 会话 事务 隔离 级别

全局事务隔离级别的英文单词:

  • global Transactional isolation level
  • 全局 事务 隔离 级别

一、什么是事务?

刚开始学,我的理解是:有很多条语句组成的,就是事务。但是,事务并不只是简单的sql语句的组合,还有一些特性。

课件的解释如下:
在这里插入图片描述

1.关于事务的特性

原子性:

  • 要么全部完成,要么全部不完成,不会结束在中间的某个环节。如果一个事务在中间的过程出错,就会回滚到事务开始前的状态。
    比如我要从建设银行中取出100块钱转账到朋友的建设银行卡中,那么这个事务处理就一定是:我的银行卡金额-100,对方的银行卡金额+100,不可能结束中间的某个环节。如果在转账过程中,网络出现问题导致转账失败,意味着该事务出错,那一定是我的银行卡金额-100,然后再+100。相当于什么都没发生。

持久性:

  • 事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。就像上面的例子,转账完成后,我的银行卡少了100,对方银行卡多了100,这个修改是永久的。

一致性和隔离性,关于这两个特性,后面再说,现在不理解。

二、为什么要有事务

事务被 MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服务的.而不是伴随着数据库系统天生就有的.

事务就是用来当有一批sql语句过来时,将这些语句打包成一个事务对象,这个对象就是事务,再交给事务执行列表,交给MySQL处理。

所以事务就是一个执行对象。帮助我们更简单地处理sql语句。

注意:在MySQL中,只有使用了Innodbs数据库引擎才支持事务。 MyISAM不支持。

三、事务的提交方式

  • 自动提交
  • 手动提交

查看事务提交方式

show variables like ‘autocommit’;
在这里插入图片描述

当执行下面sql语句后:

set autocommit=0;
意味着将事务的自动提交功能关闭了。
在这里插入图片描述

set autocommit=1;就会重新打开。
在这里插入图片描述

测试事务

准备工作

1.先将事务隔离级别设置成读未提交。(先不用管能不能看懂,先按照步骤进行操作)

mysql> set global transaction isolation level READ UNCOMMITTED;

需要先重启,才能生效。
在这里插入图片描述

事务的操作

1.启动事务

法1:

start transaction;

法2:

begin;(推荐)

在这里插入图片描述
从启动事务开始之后的所有sql语句,都属于事务。

2.对事务进行回滚(只有在事务进行期间)

1:一次性回滚到最开始

rollback;

2:回滚到某个保存点

rollback to 保存点名字;

先设置保存点:

savepoint s1;再插入数据
insert into account values(1,‘张三’,1000,1);

更多sql语句如下图:

在这里插入图片描述
完成后,结果如下:
在这里插入图片描述

再执行下面的sql语句:

rollback to s3;

该语句的意思是:回滚到s3这个保存点,也就是在s3之后执行的所有sql语句,都会被撤回。

在这里插入图片描述

此时,第三条insert语句就被回滚了。
再回滚到s1,就会发现,插入的所有数据都被撤回了。
在这里插入图片描述

3.提交事务(持久化)

要在最一开始进行启动事务后,才能提交事务。

mysql> commit;

也就是将事务内的一堆指令,交给MySQL处理。

4.事务的异常情况

在事务的执行期间,碰到mysql突然中断的情况,mysql的处理是对事务进行自动回滚。

在插入了一条语句后,我们手动关闭mysql客户端:
在这里插入图片描述
发现插入的数据并没有上一条数据。
这是因为遇到异常中断时,事务会自动回滚到最开始。
在这里插入图片描述

还有一点需要说明:
begin操作会自动更改提交方式,不会受MySQL是否自动提交影响。

只要我们启动事务,就会将自动提交设置成关闭状态。

在这里插入图片描述

结论

在这里插入图片描述

四、事务的隔离级别

1.理解隔离性

关于事务的原子性,就是 “要么有,要么没有” 的正反两面性,在这样的情况下,事务会出现:事务处理前,事务处理时,事务处理后三种情况。
而原子性就只关心事务处理前和处理后的情况,不关心事务具体怎么处理。
就像有的家庭中的妈妈对儿子说:”你要么就不学,要学你就学好“。对于妈妈来讲,只有学好和不学这两种情况,就是原子性,妈妈不关心儿子具体怎么学,学习过程是否遇到困难的情况。而对于儿子来说,学习过程可能会遇到各种各样的困难,学习环境的不同也会影响学习,所以,儿子需要隔离出一个良好的学习环境,这个就叫做隔离性。

  • 数据库中,为了保证事务执行过程不受干扰,就有一个特性:隔离性。
  • 数据库中,允许事务受不同程度的干扰,就有一个特性:隔离等级。

2.隔离级别

1.读未提交【Read Uncommitted】

这种隔离级别等于未隔离。几个事务之间可以看到其他事务没有提交的结果。
(实际中不会用这种)

2.读提交【Read Committed】

该隔离级别是大多数数据库默认的级别(但MySQL不是)。
一个事务智能看到其他已经提交的事务作出的改变。

3.可重复读【Repeatable Read】

MySQL默认的隔离级别。它确保同一个事务,在执行
中,多次读取操作数据时,会看到同样的数据行。

4.串行化【Serializable】

这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,
从而解决了幻读的问题。它在每个读的数据行上面加上共享锁,。但是可能会导致超时和锁竞争
(这种隔离级别太极端,实际生产基本不使用)

5.查看与设置隔离级别

查看隔离级别

SELECT @@global.tx_isolation; --查看全局隔离级别

SELECT @@session.tx_isolation; --查看会话(当前)全局隔离级别

SELECT @@tx_isolation; --默认查看回话全集隔离级别

设置隔离级别

– 设置当前会话 or 全局隔离级别语法 SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

设置会话事务隔离级别时,只会影响当前回话,另起一个会话时不受影响。

例:

设置会话事务隔离级别为读提交。

mysql> set session transaction isolation level read committed;

可以看到设置成功了
在这里插入图片描述

同理,设置全局事务隔离级别未读未提交:

set global transaction isolation level read uncommitted;

设置全局的,会对每一个会话都产生影响。

读未提交的问题——脏读问题

在设置全局事务读未提交的情况下:

在会话1中插入的数据,还没提交,在会话2中就能无障碍地看到,这样的现象叫做脏读。

左边回话1刚插入数据,还没commit,右边会话2就能立刻读到了。

在这里插入图片描述

读提交的问题——不可重复读问题

设置了全局会话隔离级别为:read committed;

在会话A中手动启动事务:begin;

同时启动会话B的事务,在会话B中查询account表格内容如下:
在这里插入图片描述

在会话A中,(注意,会话A和会话B都处于事务状态),插入一条新的值:
在这里插入图片描述
在会话A进行事务提交前,查询会话B:
在这里插入图片描述

发现没有看到会话A中插入的那条数据。
但是,在会话A进行事务提交后:commit;

再次查询会话B,就看到了会话A插入的那条数据。在这里插入图片描述

要知道,会话B始终处于事务状态!!!
意味着在事务过程的不同时间段,查询相同的表,发现查询到的数据不一样!!!!
读取到了不同的值,这种现象叫做不可重复读(non reapeatable read)

实际上,这也是一个问题,是大问题。

可重复读——幻读问题

可重复读就完美解决了上面的在两个并发的事务中,一个事务在插入数据,另一个查到了在对方事务插入数据前和插入数据后的变化不一样的情况。
(本质上是用了加锁+其他策略解决)

幻读发生在一个事务重新执行一个查询时,返回了一组不同的行,因为另一个并发的事务在这段时间内插入或删除了符合查询条件的记录。
这就好像出现幻觉一样。

串行化——隔离级别最高的

在这里插入图片描述

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

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

相关文章

漫步者x1穷鬼耳机双耳断连

困扰了我两天,终于有时间解决这个问题了,查看了一堆都是别的型号。怎么没人用这个啥按键都没有的耳机QAQ,幸好给我找到了说明书,啊哈哈! 说明书地址

RS8557XF功能和参数介绍及PDF资料

RS8557XF是一款单通道精密运算放大器,其主要特点包括高精度、低偏移电压、低输入偏置电流和低噪声。以下是该产品的部分参数和功能介绍: 增益带宽积 (GBW): 4.3 MHz,这使得该运放适用于较宽频率范围内的信号处理。 输入偏置电流: 650 μA&…

二叉树尾部分

1.二叉树的销毁 2.二叉树的层序遍历 3.判断二叉树是否为完全二叉树 4.二叉树的性质 1.二叉树的销毁 以后序的方式遍历销毁左右子数,因为前序和中序销毁的话根会被销毁而找不到左右子树的位置,后序的根访问在最后,可以找到左右的子树位置。…

大模型时代的具身智能系列专题(二)

李飞飞团队 李飞飞是华人在AI领域最具影响力的学者之一,她是斯坦福大学人工智能实验室(SAIL)教授,美国国家工程院院士,知名CV数据集ImageNet的牵头人,斯坦福视觉与学习实验室(SVL)的…

单链表OJ题(课堂总结)

1.链表的带环问题 上图就是一个典型的带环链表 1.1如何判读链表是否带环? 最常见的方法就是利用快慢指针,快指针追加慢指针,当二者相等的时候即可判断链表带环 其实现的代码如下: bool hasCycle(struct ListNode*head) { s…

驱动开发中引入私有数据的原因

系列文章目录 驱动开发中引入私有数据的原因 驱动开发中引入私有数据的原因 系列文章目录驱动开发中引入私有数据的原因 驱动开发中引入私有数据的原因 驱动开发中引入私有数据(Private Data)概念主要是为了解决以下几个关键问题: 1.多设备支…

Scikit-Learn朴素贝叶斯

Scikit-Learn朴素贝叶斯 1、朴素贝叶斯1.1、贝叶斯分类1.2、贝叶斯定理1.3、贝叶斯定理的推导1.4、朴素贝叶斯及原理1.5、朴素贝叶斯的优缺点2、Scikit-Learn朴素贝叶斯2.1、Sklearn中的贝叶斯分类器2.2、Scikit-Learn朴素贝叶斯API2.3、Scikit-Learn朴素贝叶斯实践(新闻分类与…

FreeRtos进阶——栈保存现场的几种场景

MCU架构 在认识栈的结构前,我们先来认识以下单片机的简单架构。在我们的CPU中有着很重要的一个模块——寄存器(R0-R15),其中R13,R14,R15的别称分别为SP栈顶指针、LR返回地址、PC当前指令地址。外部RAM是单片…

前端开发攻略---三种方法解决Vue3图片动态引入问题

目录 1、将图片放入public文件夹中 2、使用 /src/.... 路径开头 3、生成图片的完整URL地址&#xff08;推荐&#xff09; 1、将图片放入public文件夹中 使用图片&#xff1a;路径为 /public 开头 <template><div><img :src"/public/${flag ? 01 : 02}.jp…

JMeter 测试单节点与集群的并发异常率

一. JMeter 测试单节点与集群的并发异常率 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 单个tomcat测试结果(2000个用户&#xff0c;每个用户访问100次) nginx集群负载均衡tomcat结果(2000个用户&#xff0c;每个用户访问100次)

【机器学习300问】101、1x1卷积有什么作用?

卷积神经网络最重要的操作就是卷积层的卷积操作&#xff0c;之前文章中介绍过&#xff0c;卷积核filter往往都是3x3或者5x5什么的&#xff0c;但有一种非常特殊的卷积——1x1卷积。他在CNN中扮演着非常重要的角色。 一、通道维度的降维/升维 这是1x1卷积最显著的作用之一。通过…

眼底项目经验

眼底项目经验 可解释性不足问题眼底项目有多牛逼可解释性不足解法数据、算力、算法都免费送不仅预测当下&#xff0c;还能预测未来和慢病管理整合&#xff0c;形成一个实时健康检测生态 可解释性不足问题 今天下午和腾讯眼底项目人员讨论, 他们不准备做全身性的多疾种, 因为深…

按尺寸筛选轮廓图中的轮廓

1.按短边筛选 原始轮廓图&#xff1a; import cv2 import numpy as np# 读取轮廓图 contour_image cv2.imread(..\\IMGS\\pp_edge.png, cv2.IMREAD_GRAYSCALE)# 使用cv2.findContours()函数获取所有轮廓 contours, _ cv2.findContours(contour_image, cv2.RETR_EXTERNAL, cv2…

使用 Python 编程语言进行供应链分析

前言 要分析一家公司的供应链&#xff0c;我们需要供应链不同阶段的数据&#xff0c;如有关采购、制造、运输、库存管理、销售和客户人口统计的数据。我为这项任务找到了一个理想的数据集&#xff0c;其中包括一家时尚和美容初创公司的供应链数据。 1. 相关数据集 让我们导入…

如何在anaconda的环境下安装langchain

1、安装anaconda&#xff1b; 2、在终端上&#xff0c;输入&#xff1a; conda install langchain -c conda-forge Proceed ([y]/n)? y 输入&#xff1a;Y 3、安装完成后&#xff0c;输入&#xff1a; python -c "import langchain; print(langchain.__version__)&…

红外超声波雷达测距

文章目录 一HC-SR04介绍1HC-SR04简介及工作原理 二用HAL库实现HC-SR04测量距离1STM32CubeMX配置2keil53代码的添加 三效果 一HC-SR04介绍 1HC-SR04简介及工作原理 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等…

5.27周报

这两周邻近毕业故没有很多时间来学习课余内容&#xff0c;另外最近身体有些不舒服【偏头痛】&#xff0c;所以学的内容不多&#xff0c;包括SVM向量机和ResNet【不包括代码复现】 1.SVM支持向量机的大概内容 1、目的&#xff1a; 主要内容是如何找到分类的那条线【超平面】—…

如何一招破解全域运营加盟骗局?

随着全域运营的潜力被持续挖掘&#xff0c;想要通过加盟等方式做全域运营服务商的创业者数量日益增加。在此背景下&#xff0c;各种全域运营加盟骗局接踵而来&#xff0c;不少创业者不得不走上艰难的维权之路。 在采访了多位受害者后&#xff0c;我们总结出了目前已知的全域运营…

使用 FileZilla 在 Windows 和 Ubuntu 之间传文件

网线一端插在板子的WAN口上&#xff0c;另一段插在电脑上&#xff0c;然后要配一下板子的IP。 板侧&#xff1a; 使用串口链接板子与PC端&#xff1b; 输入指令 ifconfig eth0&#xff08;具体看wan口对应哪一个&#xff09; 192.168.1.99 PC端配置&#xff1a; 打开网络设…

二十八、openlayers官网示例Data Tiles解析——自定义绘制DataTile源数据

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/data-tiles.html 这篇示例讲解的是自定义加载DataTile源格式的数据。 先来看一下什么是DataTile&#xff0c;这个源是一个数组&#xff0c;与我们之前XYZ切片源有所不同。DataTile主要适用于需要动态生成…