MySQL事务(超详细!!!)

目录

一、MySQL事务的概念

二、事务的ACID特点

1、原子性(Atomicity)

2、持久性

3、隔离性(Isolation)

3.1 事务的并发问题

①、脏读(读取未提交数据)

②读已提交、不可重复读(前后多次读取,数据内容不一致)

③可重复读、幻读(前后多次读取,数据总量不一致)

④丢失更新

3.2 Mysql及事务隔离级别(四种)

3.3 事务隔离级别的作用范围分为两种

3.3.1查询与设置事务隔离级别

4、一致性(Consistency)

 三、事务控制语句

创建一个表,作为后面实验测试的数据

1、测试提交事务

2、测试回滚事务

3、测试多点回滚

4、使用 set 设置控制事务


一、MySQL事务的概念

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱, 文章等等。这样,这些数据库操作语句就构成一个事务!

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
  • 事务是通过事务的整体性以保证数据的一致性。

说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

二、事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

1、原子性(Atomicity)

  • 指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

事务是一个完整的操作,事务的各元素是不可分的。
事务中的所有元素必须作为一个整体提交或回滚。
如果事务中的任何元素失败,则整个事务将失败。

2、持久性

  • 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

指不管系统是否发生故障,事务处理的结果都是永久的。
一旦事务被提交,事务的效果会被永久地保留在数据库中。

3、隔离性(Isolation)

  • 指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

3.1 事务的并发问题

①、脏读(读取未提交数据)

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读

案列1

比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。 也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

②读已提交、不可重复读(前后多次读取,数据内容不一致)

一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

案列2

事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。

③可重复读、幻读(前后多次读取,数据总量不一致)

一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

案列3

假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读

幻读:

原因:因为mysql数据库读取数据时,是将数据放入缓存中,当事务B对数据库进行操作:例如删除所有数据且提交时,事务A同样能访问到数据,这就产生了幻读。

问题:解决了可重复读,但是会产生一种问题,错误的读取数据,对于其他事务添加的数据也将访问不到

④丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

案列4

A  30 ->40 事务 先完成
B  30 ->50 事务 后完成
B的事务结果会覆盖A的事务结果,最终值为50

3.2 Mysql及事务隔离级别(四种)

(1)read uncommitted( 读取尚未提交的数据 :不解决脏读,允许脏读,其他事务只要修改了数据未提交也能读取),即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据。

  • 安全性最差   但性能最好 (不使用)
  • 三种并发问题都没解决。

(2)read committed(提交读):读取已经提交的数据 :可以解决脏读

  • 只能读取到已经提交的数据。
  • Oracle等多数数据库默认都是该级别〈不重复读)。
  • 安全性较差  性能较好  (oracle 数据库 默认就是这种)

(3)repeatable read(可重复度):重读读取:可以解决脏读 和 不可重复读

  • mysql默认的可重复读。
  • 无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响
  • 安全性较高,性能较差 (mysql 默认的就是这种)

(4)serializable:串行化:可以解决脏读、不可重复读和虚读

  • 相当于锁表
  • 完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
  • 安全性高  、性能差 ( 不使用)

  • mysql默认的事务处理级别是 repeatable read
  • 而Oracle和SQL Server是 read committed 。

3.3 事务隔离级别的作用范围分为两种

全局级:对所有的会话有效
会话级:只对当前的会话有效

3.3.1查询与设置事务隔离级别

1、查询全局事务隔离级别

show global variables like '%isolation%';
SELECT @@global.tx_isolation;

2、查询会话事务隔离级别

show session variables like '%isolation%';
SELECT @@session.tx_isolation; 
SELECT @@tx_isolation;

3、设置全局事务隔离级别

set global transaction isolation level read committed;

4、设置会话事务隔离级别

set session transaction isolation level read committed;

4、一致性(Consistency)

  • 指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

当事务完成时,数据必须处于一致状态。
在事务开始前,数据库中存储的数据处于一致状态。
在正在进行的事务中,数据可能处于不一致的状态。
当事务成功完成时,数据必须再次回到已知的一致状态。

注意:只有当前三条性质都满足了,才能保证事务的一致性

 三、事务控制语句

BEGIN 或 START TRANSACTION:显式地开启一个事务。COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

创建一个表,作为后面实验测试的数据

create database SCHOOL;
use SCHOOL;create table info(  
id int(10) primary key not null,  
name varchar(40),  
money double  
);insert into info values(1,'A',1000);  
insert into info values(2,'B',1000); 
select * from info;

1、测试提交事务

begin;
#开启事务update info set money=money - 100 where name='qi';
#修改数据select * from info;
#查看数据表内容commit;
#提交事务
#若是没有提交事务,重新登陆后,修改的数据没有保存exit;
#退出mysql -uroot -p123456
#重新登陆use school;
#切换数据库
select * from info;
#此时查询数据表,表内数据是修改后的内容

2、测试回滚事务

begin;
#开启事务update info set money=money + 220 where id=3;
#修改数据select * from info;
#查看表中数据内容rollback;
#回滚select * from info;
#查看表中数据内容(恢复到修改数据之前)

3、测试多点回滚

begin;
#开启事务select * from info;
#查询表中数据内容update info set money=money+200 where id=1;
#修改数据savepoint S1;
#创建回滚点S1update info set money=money-100 where id=2;
#修改数据savepoint S2;
#创建回滚点S2insert into info values(3,'C',1000);
#插入新的记录savepoint S3;
#创建回滚点S3select * from info;
#查询表中数据内容rollback to S2;
#回滚到标记点S2select * from info;
#查询表中数据内容(表中没有新插入的记录)

4、使用 set 设置控制事务

SET AUTOCOMMIT=0;
#禁止自动提交SET AUTOCOMMIT=1;
#开启自动提交,Mysql默认为1SHOW VARIABLES LIKE 'AUTOCOMMIT';
#查看Mysql中的AUTOCOMMIT值
  • 如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
  • 如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
  • 当然无论开启与否,begin; commit|rollback; 都是独立的事务。
show variables like 'autocommit';
#查看mysql中的autocommit值set autocommit=0;
#禁止自动提交show variables like 'autocommit';
#查看mysql中的autocommit值insert into info values(4,'D',2000);
#表中插入记录select * from info;
#查看数据表内容exit
#退出mysql -uroot -p123456
#重新登陆mysqluse school;
#切换数据库select * from infoe;
#查看数据表内容(插入表中的数据没有保存)

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

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

相关文章

【Redis主从架构。主从工作原理psync、bgsave、部分数据复制、主从复制风暴解决方案】【Redis哨兵高可用架构。sentinel】

Redis主从架构 Redis主从工作原理数据部分复制 Redis哨兵高可用架构client连接哨兵规则主节点挂了,集群从新选择主节点,并且同步给sentinel 转自图灵课堂 redis主从架构搭建,配置从节点步骤: 1、复制一份redis.conf文件2、将相关…

美易官方:除了散户,对冲基金也在重返加密市场

高盛:除了散户,对冲基金也在重返加密市场 随着加密货币市场的逐渐成熟和技术的不断进步,越来越多的机构投资者开始重新审视加密货币市场。除了散户投资者外,对冲基金也在重返加密市场,成为市场的重要参与者之一。高盛作…

苹果手机强制重启方法大揭秘!不同机型多种方法一网打尽

随着苹果手机的普及,越来越多的人选择使用这款优秀的智能手机。然而,就像任何其他设备一样,苹果手机也可能会出现各种问题,例如系统崩溃、应用程序冻结或其他错误。在这种情况下,强制重启手机是解决问题的一个有效方法…

Pygame基础3-动画

3.动画 原理 动画是连续播放的图片。 使用精灵显示动画只需要在update()方法中改变精灵的图片。 需要注意的是播放速度,可以 通过pygame.time.get_ticks()来控制时间,但是这样比较复杂。最直接的方式是根据帧数来控制播放。每过n帧就切换一次图片。 …

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构(字段) 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL:数据定义语言&am…

Web安全基础入门+信息收集篇

教程介绍 学习信息收集,针对域名信息,解析信息,网站信息,服务器信息等;学习端口扫描,针对端口进行服务探针,理解服务及端口对应关系;学习WEB扫描,主要针对敏感文件,安全漏洞,子域名信息等;学习信息收集方法…

SpringMVC | SpringMVC中的 “文件上传和下载”

目录: 一、文件上传1.1 文件上传“概述”1.2 文件上传“具体配置” :“前端”中配置“文件上传” ( type“file” 满足3个条件 )“后端”中配置“文件上传” ( 配置id为“CommonsMultipartResolver”的bean 配置“文件上传”的“约束条件” 通过“MultipartFile接口”参数接…

RabbitMQ 的高阶应用及可靠性保证

目录 一、RabbitMQ 高阶应用 1.1 消息何去何从 1.2 过期时间 1.3 死信队列 1.4 延迟队列 1.5 优先级队列 1.6 消费质量保证(QOS) 二、持久化 三、生产者确认 四、消息可靠性和重复消费 4.1 消息可靠性 4.2 重复消费问题 上篇文章介绍了 Rabb…

流畅的 Python 第二版(GPT 重译)(三)

第五章:数据类构建器 数据类就像孩子一样。它们作为一个起点是可以的,但要作为一个成熟的对象参与,它们需要承担一些责任。 马丁福勒和肯特贝克 Python 提供了几种构建简单类的方法,这些类只是一组字段,几乎没有额外功…

Linux 安装 JDK、MySQL、Tomcat(图文并茂)

所需资料 下载 1.1 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压,修改配置即可rpm安装软件已经按照re…

美易官方:科技巨头涨势好标普指数年底前有望升至6000点

高盛,作为全球领先的金融机构之一,近日发布了一份报告,预测在科技巨头的涨势推动下,标普500指数年底前有望升至6000点。这一预测引起了市场的广泛关注,投资者们纷纷开始重新评估自己的投资策略。 David Kostin等策略师…

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶…

202基于matlab的曲柄滑块机构的运动学仿真分析

基于matlab的曲柄滑块机构的运动学仿真分析,分析各个杆的速度、位移、加速度曲线,以及曲柄滑块机构的动画。程序已调通,可直接运行。 202 matlab 曲柄滑块机构 运动学仿真分析 - 小红书 (xiaohongshu.com)

第九篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python处理PDF文件

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、重要作用介绍二、Python库处理PDF文件基础操作和高级操作介绍(一)基础操作介绍(二)高级操作介绍 三、Python库处理PDF文件基础操作示例代码…

H5实现Web ECharts教程:轻松创建动态数据图表

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

【OpenBayes 官方教程】快速部署通义千问 72B 大模型

本教程主要为大家介绍怎样在 OpenBayes 上快速部署通义千文 72B 大模型,新朋友点击下方链接注册后,即可获得 4 小时 RTX 4090 5 小时 CPU 的免费使用时长哦! 注册链接 https://openbayes.com/console/signup?ryuudi_nBBThttps://openbaye…

算法|数学与数论|素数筛

数学与数论|素数筛 1.判断素数 2.朴素筛 3.埃氏筛 4.欧拉筛(线性筛) 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 质数(素数)&…

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时,通常要求数据加密的安全级别不高,但希望加解密时间复杂度尽可能低。这时使用传统的对称加密(如3DES、AES)或非对称加密(如RSA、ECC)显然不太适合。因为加密的安全级别…

【MySQL】10. 复合查询(重点)

复合查询(重点) 前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。 1. 基本查询回顾 数据还是使用之前的雇员信息表 在标题7的位置! mysql> select * from emp where sal > 500 or job MANAG…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样,也是数据结构的一种&…