MySQL-----事务

一  事务简介

        事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一
个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

例如:银行转账


张三 ---(转账1000元)--->  李四
在进行转账的具体逻辑:
a.查询张三的账户余额
b.张三的账户余额-1000
c.李四的账户余额+1000
假如发生异常:
a执行成功,b执行成功,执行c时业务抛出异常
意味着:张三的钱减少了,但是李四的钱并没有增加,这个时候数据就出现问题,
对于这种问题就要用到数据库的事务操作,要么全部执行成功,要么全部执行失败。 

将[a,b,c]三个事件封装到一个事务中,首先开启事务,如果事务中的每一个步骤都成功完成,那么最终提交任务,一旦有一个步骤无法成功实现,那么就会进行回滚事务,回滚事务会将之前修改的数据全部重置为原来的数据。

        MYSQL是具有自动提交事务的功能,也就是说每当我们执行一条SQL语句,MySQL就会自动提交事务。因此我们想要把若干个操作放在一个事务内,我们就要手动的去开启事务,手动的去提交事务,如果出现异常手动的实现事务的回滚。

二  操作演示

准备数据

-- 事务的操作
create table account(id int auto_increment primary key comment '主键ID',name varchar(10) comment '姓名',money int comment '金额') comment '账户表';insert into account(id,name,money) values (null,'张三',2000),(null,'李四',2000);

正常的转账情况

-- 转账操作(张三给李四转账1000)
-- 1.查询张三账户余额
select * from account where name = '张三'-- 2.将张三账户的余额-1000update account set money = money -1000 where name = '张三';-- 3.将李四的账户余额+1000update account set money = money + 1000 where name = '李四';

出现异常的情况

将select中直接添加汉字运行即可出现异常。

运行效果

        可以发现张三的账户余额减少,但是李四的账户余额并没有发生变化。因此为了处理这个问题我们就要用到事务。接下来讲如何操作。

▶ 事务操作

-- 查看/设置事务提交方式
select @@autocommit;
set @@autocommit =0;


-- 提交事务
commit;


-- 回滚事务
rollback;

方式一:

这样操作可以实现事务的操作,保证出现异常情况数据不会被修改

方式二:
 

-- 开启事务
start transaction 或 begin;
-- 提交事务
commit;
-- 回滚事务
ROLLBACK;

 三  四大特性

■   原子性(Atomicity)︰事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
■  一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
■  隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
■  持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

 四  并发事务问题

 一.脏读

事务A中执行三个操作,假如第一个执行select语句,第二个执行update语句,事务没有执行完成的时候事务是没有提交的,只有事务的三步操作完成以后才会提交,事务A执行第二步以后就会对数据库里面的内容进行更新,而此时事务B要执行的就是一个查询的工作,
那么B事务就会将这个更新了的数据查询到,此时事务A还没有进行完成。一个事务读取到了另一个事务没有执行完成的数据:脏读。

 二.不可重复读

        事务A先执行一个select操作,B事务进行了一个UPdate操作并进行了提交,然后A事务第三步又执行了一个select操作,而此时读取出的数据和第一次读取出的数据不同。

 三.幻读

        事务A,第一步select操作发现没有数据,事务B进行insert操作,并提交到了数据库。接下来,事务A执行第二部insert操作,此时不能插入成功(id是主键)。

 五  事务的隔离级别

 ▶ 基本语法 

-- 查看事务隔离级别
select @@transaction_isolation;


-- 设置事务隔离级别
SET [SESSION|GLOBAL ] TRANSACTION IsOLATION LEVEL { READ UNCOMMITTED |READ COMMiTTED | REPEATABLE READ |SERIALIZABLE}

 

        这里模拟两个事务,我们可以开两个窗口模拟实现,这里用命令行模式。

1.READ UNCOMMITTED

模拟出现脏读。事务A读取到了事务B还没有提交的数据。

2.READ COMMITTED 

READ COMMITTED 解决了脏读,但是出现了不可重复读

 

 

3.REPEATABLE READ

        解决了不可重复读,但是存在幻读问题。

 事务A先查询了一次ID为3的记录发现并没有,此时事务B对account修改插入了一条ID为三的数据并进行了提交,然后事务A由于没有查询到ID为3的记录,将执行一次插入ID为3的操作,可时,出现了主键约束不能重复的问题,表示已经有了ID为3的记录,可时接下来再执行查询语句,发现ID为3的记录仍然没有,这就是出现的幻读。如下图所示: 

4.SERIALIZABLE

        SERIALIZABLE可以规避所有的并发事务问题,但是它的性能最差。事务A还在执行中时,事务B对表进行插入数据明显发生阻塞现象,只有事务A提交了事务B才可以继续执行,很好的避免了幻读的问题,如下图所示:

 

注意:

事务的隔离级别越高,数据越安全,但是性能越来越低。 

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

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

相关文章

.NET开源快速、强大、免费的电子表格组件

今天大姚给大家分享一个.NET开源(MIT License)、快速、强大、免费的电子表格组件,支持数据格式、冻结、大纲、公式计算、图表、脚本执行等。兼容 Excel 2007 (.xlsx) 格式,支持WinForm、WPF和Android平台:ReoGrid。 项…

Spring Chache入门详解、配套小案例

简介:Spring Cache是一个框架,实现了基于注解的缓存功能,只需要添加一个注解就能实现缓存功能。 Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,如下: EHCacheCaffeineRedis (这篇帖子&#xff…

下载指定版本的pytorch

下载网址:https://download.pytorch.org/whl/torch_stable.html 参考博客网址:https://blog.csdn.net/wusuoweiieq/article/details/132773977

基于C++的反射功能

需求&#xff1a; 利用C的发射机制&#xff0c;实现根据字符串创建实例对象。 代码&#xff1a; #ifndef OBJECT_H #define OBJECT_H#include <string> #include <map>typedef void* (*Constructor)();class CObjectFactory { public:static void registerClass…

【Git版本控制系统】:起步

目录 前言 版本控制 集中式与分布式的区别 Windows安装Git 核心 文件状态 工作区域 基本工作流程 配置用户信息 获取帮助 在线资源 前言 本篇文件的环境是Windows环境下实现。 在日常工作中git少不了&#xff0c;所以编写本篇文章介绍Git基础&#xff0c;专栏会不…

Linux/secret

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和3000端口&#xff0c;端口详细信息如下 可以看到22端口对应的是ssh服务&#xff0c;80和3000都是http服务&#xff0c;80端口使用nginx&#xff0c;3000使用了Node.js TCP/80 可以先从80端口开始探索&…

网络原理(1)——UDP协议

目录 一、应用层 举个例子&#xff1a;点外卖 约定数据格式简单粗暴的例子 客户端和服务器的交互&#xff1a; 序列化和返序列化 xml、json、protobuffer 1、xml 2、json 3、protobuffer 二、传输层 端口 端口号范围划分 认识知名的端口号 三、UDP协议 端口 U…

数据结构之顺序表(包学包会版)

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 3.总结 halo&#xff0c;又和大家见面了&#xff0c;今天要给大家分享的是顺序表的知识&#xff0c;跟着我的脚步&#xff0c;包学包会哦~ 规矩不乱&#xff0c;先赞后看&#xff01; ps&#xff1a;&#xff08;孙权…

【MMDetection3D实战5】Dataset 和 model配置文件解析

文章目录 1. Dataset 配置文件解析1. 1 定义全局变量1. 1 数据处理pipeline(1) train_pipeline(2) test_pipeline(3) eval_pipeline1. 2 data 字典的定义2. model 配置文件解析2. 1 体素化voxel_layer2. 2 voxel_encoder2. 3 middle_encoder2. 4 2D 检测网络(backbone + neck …

详解(实现)堆的接口函数

文章目录 堆堆的顺序存储 准备工作创建头文件Heap.h创建源文件Heap.c头文件的包含定义保存堆数据的结构体 初始化销毁堆插入数据向上调整算法图解算法代码 删除堆顶向下调整算法图解代码 取出堆顶数据求堆的数据个数判断堆是否为空全部代码Heap.hHeap.c 再了解堆之前我们先要了…

AI毕业论文降重GPTS,避免AI检测,高效完成论文

视频演示 AI毕业论文降重GPTS&#xff0c;避免AI检测&#xff0c;高效完成论文&#xff01; 开发目的 “毕业论文降重”GPTS应用&#xff0c;作用为&#xff1a;重新表述学术论文&#xff0c;降低相似性评分&#xff0c;避免AI检测。 使用地址 地址&#xff1a;毕业论文降重…

unraid docker.img扩容

unraid 弹Docker image disk utilization of 99%&#xff0c;容器下载/更新失败 我的版本是6.11.5&#xff0c;docker.img满了导致容器不能更新&#xff0c;遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来&#xff0c;我已经清理过只清理出来1G多点&…

【四 (3)数据可视化之 Seaborn 常用图表及代码实现 】

目录 文章导航一、介绍二、安装Seaborn三、导入Seaborn四、设置可以中文显示五、占比类图表1、饼图2、环形图 六、比较排序类1、条形图2、箱线图3、小提琴图 七、趋势类图表1、折线图 八、频率分布类1、直方图 九、关系类图表1、散点图2、成对关系图3、热力图 文章导航 【一 简…

基于SpringBoot+Vue交流和分享平台的设计与实现(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

Apache zookeeper kafka 开启SASL安全认证

背景&#xff1a;我之前安装的kafka没有开启安全鉴权&#xff0c;在没有任何凭证的情况下都可以访问kafka。搜了一圈资料&#xff0c;发现有关于sasl、acl相关的&#xff0c;准备试试。 简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发…

【人工智能入门必看的最全Python编程实战(5)】

--------------------------------------------------------------------- 1.AIGC未来发展前景 未完持续… 1.1 人工智能相关科研重要性 拥有一篇人工智能科研论文及专利软著竞赛是保研考研留学深造以及找工作的关键门票&#xff01;&#xff01;&#xff01; 拥有一篇人工…

AIDD简介——分类和回归任务

&#x1f31e;欢迎来到AI生物医药的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f320;本阶段属于练气阶段&#xff0c;希望各位仙友顺利…

《ARM汇编与逆向工程 蓝狐卷 基础知识》

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Ubuntu20下C/C++编程开启TCP KeepAlive

1、在linux下&#xff0c;测试tcp保活&#xff0c;可以使用tcp自带keepalive功能。 2、几个重要参数&#xff1a; tcp_keepalive_time&#xff1a;对端在指定时间内没有数据传输&#xff0c;则向对端发送一个keepalive packet&#xff0c;单位&#xff1a;秒 tcp_keep…