【MySQL】事务

目录

  • 一、事务的概念
  • 二、支持事务的存储引擎
  • 三、事务的提交方式
  • 三、事务的操作
  • 四、事务的隔离级别
  • 五、一致性

一、事务的概念

  • 事务由一条或多条SQL语句组成,这些语句在逻辑上存在相关性,共同完成一个任务,事务主要用于处理操作量大,复杂度高的数据。比如转账就涉及多条说SQL语句,包括查询余额(select)、在当前账户上减去指定金额(update)、在指定账户上加上对应金额(update)等,将这多条SQL语句打包便构成了一个事务。
  • MySQL同一时刻可能存在大量事务,如果不对这些事务加以控制,在执行时就可能会出现问题。比如单个事务内部的某些SQL语句执行失败,或是多个事务同时访问同一份数据导致数据不一致的问题。

因此一个完整的事务并不是简单的SQL集合,事务还需要满足如下四个属性:

  • 原子性: 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,则会自动回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 持久性: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
  • 隔离性: 数据库允许多个事务同时访问同一份数据,隔离性可以保证多个事务在并发执行时,不会因为由于交叉执行而导致数据的不一致,
  • 一致性: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏,这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联型以及后续数据可以自发性地完成预定的工作。

上面的四个属性简称ACID:

  • 原子性(Atomicity,又称不可分割性)。
  • 一致性(Consistency)。
  • 隔离性(Isolation,又称独立性)。
  • 持久性(Durability)。

为什么会有事务

  • 事务被MySQL编写者设计出来,本质是为了当前应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要用户自己去考虑各种各样潜在的错误和并发问题。
  • 如果MySQL只是单纯的提供数据存储服务,那么用户在访问数据库时就需要自行考虑各种潜在问题,包括网络异常、服务器宕机等。因此事务本质是为了应用服务的,而不是伴随着数据库系统天生就有的。

二、支持事务的存储引擎

通过指令 show engines; 可以查看支持事务的存储引擎

  • Engine: 表示存储引擎的名称。
  • Support: 表示服务器对存储引擎的支持级别,YES表示支持,NO表示不支持,DEFAULT表示数据库默认使用的存储引擎,DISABLED表示支持引擎但已将其禁用。
  • Comment: 表示存储引擎的简要说明。
  • Transactions: 表示存储引擎是否支持事务,可以看到InnoDB存储引擎支持事务,而MyISAM存储引擎不支持事务。
  • XA: 表示存储引擎是否支持XA事务。
  • Savepoints: 表示存储引擎是否支持保存点。

三、事务的提交方式

事务常见的提交方式有两种,分别是自动提交和手动提交。

通过show命令查看autocommit全局变量,可以查看事务的自动提交是否被打开。如下:
在这里插入图片描述
可以看到事务的自动提交方式默认是打开的。

我们可以通过手动设置的方式更改事务提交方式
在这里插入图片描述

注意:这里需要知道的知识点就是,单条sql也是一个事务。
这里设置的自动提交事务的方式只是影响单条sql语句的事务。
begin和start transaction开启的事务必须使用commit手动关闭。

三、事务的操作

先做一个准备工作,将mysql的事务隔离级别(后面学习)设置为 read uncommited,设置完重启mysql服务
在这里插入图片描述

在这里插入图片描述
创建一张员工工资表
在这里插入图片描述
再创建一个客户端,记得事务设置为读未提交后需要重新启动以下mysql客户端,这样配置才可以生效。然后再打开一个客户端
在这里插入图片描述
现在准备工作已经做好,先插入两条数据在表中,此时查看表数据
在这里插入图片描述
开始演示

开启事务的两种方式

方式1:

start transaction; 

方式2:

begin;

我们演示使用begin;

在这里插入图片描述

在这里插入图片描述

总结:

  • 事务开启方式使用start transaction 或者 begin
  • 可以设置保存点,用来回退事务,savepoint s1(保存点)
  • 使用rollback to命令回退到保存的事务点,
  • 使用rollback 命令回退所有事务。
  • 使用commit提交一条事务。

事务的原子性体现

在这里插入图片描述
当一个事务在没有提交就进行退出或者异常退出时,恢复对sql表的修改,体现了事务的原子性,要么就不做,要么就做完。

四、事务的隔离级别

  • MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务的方式进行。
  • 一个事务可能由多条SQL语句构成,也就意味着任何一个事务,都有执行前、执行中和执行后三个阶段,而所谓的原子性就是让用户层要么看到执行前,要么看到执行后,执行中如果出现问题,可以随时进行回滚,所以单个事务对用户表现出来的特性就是原子性。
  • 但毕竟每个事务都有一个执行的过程,在多个事务各自执行自己的多条SQL时,仍然可能会出现互相影响的情况,比如多个事务同时访问同一张表,甚至是表中的同一条记录。
  • 数据库为了保证事务执行过程中尽量不受干扰,于是出现了隔离性的概念,而数据库为了允许事务在执行过程中受到不同程度的干扰,于是出现了隔离级别的概念。

数据库事务的隔离级别有以下四种:

  • 读未提交(Read Uncommitted):在该隔离级别下,所有的事务都可以看到其他事务没有提交的执行结果,实际生产中不可能使用这种隔离级别,因为这种隔离级别相当于没有任何隔离性,会存在很多并发问题,如脏读。幻读、不可重复读等。
  • 读提交(Read Committed): 该隔离级别是大多数数据库的默认隔离级别,但它不是MySQL默认的隔离级别,它满足了隔离的简单定义:一个事务只能看到其他已经提交的事务所做的改变,但这种隔离级别存在不可重复读和幻读的问题。
  • 可重复读(Repeatable Read): 这是MySQL默认的隔离级别,该隔离级别确保同一个事务在执行过程中,多次读取操作数据时会看到同样的数据,即解决了不可重复读的问题,但这种隔离级别下仍然存在幻读的问题。
  • 串行化(Serializable): 这是事务的最高隔离级别,该隔离级别通过强制事务排序,使之不可能相互冲突,从而解决了幻读问题。它在每个读的数据行上面加上共享锁,但是可能会导致超时和锁竞争问题,这种隔离级别太极端,实际生成中基本不使用。

说明一下:

  • 虽然数据库事务的隔离级别有以上四种,但一个稳态的数据库只会选择这其中的一种,作为自己的默认隔离级别。但数据库默认的隔离级别有时可能并不满足上层的业务需求,因此数据库提供了这四种隔离级别,可以让我们自行设置。
  • 隔离级别基本上都是通过加锁的方式实现的,不同的隔离级别对锁的使用是不同的,常见的有表锁、行锁、写锁、间隙锁(GAP)、Next-Key锁(GAP+行锁)等。

查看设置隔离级别

查看隔离级别
在这里插入图片描述

设置隔离级别
在这里插入图片描述
这里需要注意的地方时,当前会话的事务隔离级别默认是读取全局属性的事务隔离级别,
如果在当前会话修改全局属性事务隔离级别,当前会话事务隔离级别不会随之改变,
需要进行set设置或者重启mysql服务,再次读到的就是设置的全局属性的事务隔离级别。

下面进行演示四种隔离级别

读未提交(read uncommitted)

事实上我们在做前面实验的时候使用的就是读未提交的隔离级别。

准备:启动两个mysql服务,使用两个事务并发访问的方式进行测试
在这里插入图片描述

  • 读未提交是事务的最低隔离级别,几乎没有加锁,虽然效率高,但是问题比较多,所以严重不建议使用。
  • 一个事务在执行过程中,读取到另一个执行中的事务所做的修改,但是该事务还没有进行提交,这种现象叫做脏读。

读提交(Read Committed)

启动两个终端,将隔离级别都设置为读提交
在这里插入图片描述

一个事务在执行过程中,两个相同的select查询得到了不同的数据,这种现象叫做不可重复读。

可重复读(Repeatable Read)

启动两个终端,将隔离级别都设置为可重复读,可重复读也是mysql服务默认的一个事务隔离级别
在这里插入图片描述

  • 在可重复读隔离级别下,一个事务在执行过程中,相同的select查询得到的是相同的数据,这就是所谓的可重复读。
  • 一般的数据库在可重复读隔离级别下,update数据是满足可重复读的,但insert数据会存在幻读问题,因为隔离性是通过对数据加锁完成的,而新插入的数据原本是不存在的,因此一般的加锁无法屏蔽这类问题。
  • 一般的数据库在可重复读情况的时候,无法屏蔽其他事务insert的数据(为什么?因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉。这种现象,叫做幻读(phantom read)。很明显,MySQL在RR级别的时候,是解决了幻读问题的(解决的方式是用Next-Key锁(GAP+行锁)解决的。

串行化(Serializable)

启动两个终端,将隔离级别都设置为串行化
在这里插入图片描述
在这里插入图片描述

串行化是事务的最高隔离级别,多个事务同时进行读操作时加的是共享锁,因此可以并发执行读操作,但一旦需要进行写操作,就会进行串行化,效率很低,几乎不会使用。

五、一致性

事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态,当数据库只包含事务成功提交的结果时,数据库就处于一致性状态。

  • 事务在执行过程中如果发生错误,则需要自动回滚到事务最开始的状态,就像这个事务从来没有执行过一样,即一致性需要原子性来保证。
  • 事务处理结束后,对数据的修改必须是永久的,即系统故障也不能丢失,即一致性需要持久性来保证。
  • 多个事务同时访问一份数据时,必须保证这个多个事务在并发执行时,不能因为由于交叉执行而导致数据不一致,即一致性需要隔离性来保证。
  • 此外,一致性与用户的业务逻辑强相关,如果用户本身的业务逻辑有问题,最终也会让数据库处于一种不一致的状态。

也就是说,一致性实际是数据库最终要达到的效果,一致性不仅需要原子性、持久性和隔离性来保证,还需要上层用户编写出正确的业务逻辑。

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

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

相关文章

258:vue+openlayers加载mapbox-style的地图

第258个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加mapbox地图,跟之前的不同处理方式是,这里采用了ol-mapbox-style插件来加载mapbox地图。具体请参考源代码和API。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

STM正点mini-跑马灯

一.库函数版 1.硬件连接 GPIO的输出方式:推挽输出 IO口输出为高电平时,P-MOS置高,输出为1,LED对应引脚处为高电平,而二极管正&#…

深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

序列模型(Sequence Model) 基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…

Flutter中实现中国省份地图

效果展示(这里只展示局部,完全展示违规): 可以点击省份改变颜色,更多功能可以自行拓展。 注:非完整中国地图!!! 本文用于记录在Flutter项目中安卓端实现中国地图,因为实现过程是通过…

代码随想录算法训练营第31天 | 贪心算法理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

贪心算法理论基础 选取每一阶段的局部最优,堆叠成全局最优。遇到求最优解问题时,可以先手动模拟一下,将问题分解,举例分析小问题的局部最优是否能达到全部最优,能的话就可以试一下贪心算法。贪心算法的题没有固定的套…

个体诊所电子处方系统设计,社区门诊处方开单管理系统软件教程

个体诊所电子处方系统设计,社区门诊处方开单管理系统软件教程 一、前言 以下软件程序操作教程以 佳易王诊所电子处方管理系统软件V17.3为例说明 如图,在基本信息设置里,可以设置处方配方模板,这样在开电子处方的时候可以一键导入…

MYSQL表的约束详解!

文章目录 前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键 前言 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据…

【服务器】关于lspci指令查看网卡数量的小坑

准备用lspci指令查看服务器上有多少个网卡,但是由于对lspci的输出结果不了解,导致得到了错误的结果,折腾了好几周 T_T 一、什么是lspci指令?如何使用? 1、lspci指令用来查看当前系统连接的所有PCI/PCIe设备 2、使用…

单元测试——题目十二

目录 题目要求: 定义类 测试类 题目要求: 根据下列流程图编写程序实现相应处理,执行j=10*x-y返回文字“j1=:”和计算值,执行j=(x-y)*(10⁵%7)返回文字“j2=:”和计算值,执行j=y*log(x+10)返回文字“j3=:”和计算值。 编写程序代码,使用JUnit框架编写测试类对编写的…

Android读写文件,适配Q以上

Android Q升级了文件系统,访问文件不仅仅是说动态权限了,有各种限制。权限什么的就不赘述了,下面介绍一下在10以上的系统中访问文件。 首先是打开文件管理器 /*** 打开文件管理器 存储卡和外接U盘都可以访问*/public void openFileManager()…

太阳能 LED 恒流电源 升降压原理图 AP9193 大功率升压恒流IC

特别 宽输入电压范围:3.6V~100V 高效率:可高达 95% 工作频率:1MHz CS 限流保护电压:250mV FB 电流采样电压:250mV 芯片供电欠压保护:2.5V 关断时间可调 外置频率补偿脚 应用领域 LED 灯杯 电池供…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head …

Navicat 16 for MySQL:打造高效数据库开发管理工具

随着数据的快速增长和复杂性的提升,数据库成为了现代应用开发中不可或缺的一部分。而在MySQL数据库领域,Navicat 16 for MySQL作为一款强大的数据库开发管理工具,正受到越来越多开发者的青睐。 Navicat 16 for MySQL拥有丰富的功能和直观的界…

Pygame之纯Python实现你好2024效果

Pygame之纯Python实现你好2024效果 前言: 对于某些指JavaScript与前端实现为Python实现你好2024效果的营销号实在看不下去了。无底线营销,还要私信拿源码,hhh 于是就有了以下代码: 运行前安装pygame pip install pygame运行效果…

鸿蒙系统的APP开发

鸿蒙系统(HarmonyOS)是由华为公司开发的一款分布式操作系统。它被设计用于在各种设备上实现无缝的、统一的用户体验,包括智能手机、平板电脑、智能电视、智能穿戴等设备。鸿蒙系统的核心理念是支持多终端协同工作,使应用能够更灵活…

Vulnhub-dc5

靶场下载 https://download.vulnhub.com/dc/DC-5.zip 信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 20:56 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00057s latency). MAC Address:…

『建议收藏』OpenAI官方出的Prompt提示词教程中文版来了!

一些结论 六大策略: 写清晰的指令 提供参考文本 将复杂任务分解为更简单的子任务 给模型时间“思考” 使用外部工具 系统性测试变化 提高结果质量的六大策略 写清晰的指令 这些模型无法读懂你的想法。如果输出过长,要求简短回复;如果输出过于简单…

STM32(更新中)

目录 1 时钟(心跳) 1.1 CubeMX基本配置 1.2 外设在时钟上的分配原理 1.3 时钟树 2 寄存器(地址) 3 GPIO 3.1 GPIO实物 3.2 GPIO两种结构(推挽/开漏) 3.3 LED 3.4 CUBEMX 3.5 常用函数 …

Redis常见数据类型[上]

目录 前言: 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构和内部编码 内部编码: 单线程架构 引出单线程模型: 为什么单线程还这么快? String字符串 字符串数据类型: 常见命令: S…