【MySQL事务(上)】

文章目录

  • 前言
  • 一、什么是事务?
    • 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.mzph.cn/news/842563.shtml

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

相关文章

侧缝计怎么安装_测缝计安装方法介绍

测缝计作为土木工程和结构健康监测中常用的仪器,用于测量裂缝或接缝的张开和闭合情况。正确的安装是确保测缝计能够准确、可靠地工作的关键。本文将详细介绍测缝计的安装方法,以确保测量结果的准确性和可靠性。 上传中 点击输入图片描述(最多…

Qt for android 串口库使用

简介 由于Qt for android并没有提供android的串口执行方案,基于需要又懒得自己去造轮子, 使用开源的 usb-serial-for-android 库进行串口访问读写。 如果有自己的需要和库不满足的点,可以查看库的底层调用的Android相关API C/C 串口库 对应…

01Python相关基础学习

Python基础 模块相关导入模块sys模块 模块相关 导入模块 1. import 模块名 2. import 模块名 as 别名 3. from 模块名 import 成员名 as 别名sys模块 1. sys.argv 介绍: 实现从程序的外部想程序传递参数返回的是一个列表,第一个元素是程序文件名,第二个元素是程序外部传入的…

RabbitMQ(一)概述第一个应用程序

文章目录 概述AMQP和JMS官网安装开始第一个程序 概述 消息队列是实现应用程序和应用程序之间通信的中间件产品 AMQP和JMS 工作体系 官网 https://www.rabbitmq.com/ RabbitMQ是一款基于AMQP、由Erlang语言开发的消息队列产品 安装 # 拉取镜像 docker pull rabbitmq:3.13-m…

民国漫画杂志《时代漫画》第7期.PDF

时代漫画07.PDF: https://url03.ctfile.com/f/1779803-1247458105-0a2c41?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

Java进阶学习笔记23——API概述

API: API(Application Programming Interface)应用程序编程接口 就是Java帮我们写好了一些程序:如类、方法等等,我们直接拿过来用就可以解决一些问题。 为什么要学别人写好的程序? 不要重复造轮子。开发…

哈希表详解及模拟实现(unordered_map)

目录 认识哈希表: 哈希冲突: 除留余数法--(常用) 平方取中法--(了解) 折叠法--(了解) 随机数法--(了解) 泛型编程: 闭散列: 线性探测: 二次探测: 扩容: 查找: 插入&#…

PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法

PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法 吃鸡热潮依旧绝地求生PUBG可是咱们玩家的心头好啊!不过有时候可能会遇到点小麻烦,比如PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法。小编这就给大家分享几个超实用的解决方法&…

LDRA Testbed(TBrun)软件单元测试_操作指南

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

YOLOv10来了

B站:啥都会一点的研究生公众号:啥都会一点的研究生 前言 YOLOv10 由清华大学研究人员在 Ultralytics版基础上进行进一步开发,引入了一种新的实时目标检测方法,解决了以前版本 YOLO 在后处理和模型架构方面的不足。通过消除非最大…

[8] CUDA之向量点乘和矩阵乘法

CUDA之向量点乘和矩阵乘法 计算类似矩阵乘法的数学运算 1. 向量点乘 两个向量点乘运算定义如下: #真正的向量可能很长,两个向量里边可能有多个元素 (X1,Y1,Z1) * (Y1,Y2,Y3) X1Y1 X2Y2 X3Y3这种原始输入是两个数组而输出却缩减为一个(单一值)的运…

linux 查看csv文件,按指定列聚合 排序

在Linux中,你可以使用awk工具来查看CSV文件的内容,并按照指定的列进行聚合。awk是一种强大的文本处理工具,它可以处理文本文件中的数据,并根据条件执行相应的操作。 以下是一个示例,假设你有一个名为data.csv的CSV文件…

单点登录(JWT实现)

单点登陆的英文名是:Single Sign On(简称SSO),只需要登陆一次,就可以访问所有信任的应用系统。 在单体项目中,我们登陆之后可以把验证用户信息的值放入session中,单个tomcat中的session是可以共…

C++ 数据结构算法 学习笔记(33) -查找算法及企业级应用

C 数据结构算法 学习笔记(33) -查找算法及企业级应用 数组和索引 日常生活中,我们经常会在电话号码簿中查阅“某人”的电话号码,按姓查询或者按字母排 序查询;在字典中查阅“某个词”的读音和含义等等。在这里,“电话号码簿”和…

【FPGA】Verilog:2-bit 二进制比较器的实现(2-bit binary comparator)

解释 2-bit 二进制比较器仿真结果及过程说明(包括真值表和卡诺图) 真值表和卡洛图如下: 2-bit Binary Comparator A1 A2 B1

写好的文章怎样联系媒体投稿?

作为单位信息宣传的桥梁,我肩负着将单位的每一次活动、每一项成就转化为社会认可与赞美的重任。初涉此职,我满腔热血,以为凭借扎实的文字功底与不懈的努力,便能在各大媒体平台上为单位赢得一席之地。然而,现实很快就给了我一记响亮的耳光。 我最初采取的是最直接的方式——邮箱…

QT 使用QLsitView 实现多个子项选中取消效果

文章目录 效果图概述部分代码总结 效果图 概述 整个界面的布局介绍请看这篇博客想要的到这种自由选择中的Item效果,需要使用到Model-view的思想,每个item中都要存放一个标志位,用在Paint函数去判断是否绘制为按下的状态。每次item被点击时&a…

记录下所遇到远程桌面连接方法winSCP跟mstsc

之前公司使用过连接远程桌面,今天又遇到要使用远程桌面问题,来记录下。 之前公司使用的是winR 然后回车弹出 后面按照用户名密码就能登陆了 今天后台给了我一张图片准备接着用这个方法,后台就说这个东西要下载winSCP 后台发给我图片 然后去…

[笔试强训day09]

文章目录 BC146 添加逗号DP2 跳台阶JZ61 扑克牌顺子解法一&#xff1a;排序模拟解法二&#xff1a;规律哈希 BC146 添加逗号 BC146 添加逗号 #include<iostream> #include<string>using namespace std;int main() {string s;cin>>s;string ans;for(int i0;i…

LLaMa系列模型详解(原理介绍、代码解读):LLaMA 2

LLaMA 2 大型语言模型&#xff08;LLMs&#xff09;作为高度能力的人工智能助手&#xff0c;在需要跨多个领域专家知识的复杂推理任务中表现出巨大潜力&#xff0c;包括编程和创意写作等专业领域。它们通过直观的聊天界面与人类互动&#xff0c;这导致了快速和广泛的公众采用。…