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。 项…

while语句的实际应用(2)

3150:【例25.2】 26个兄弟姐妹2 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6770 通过数: 4845 【题目描述】 26个字母26枝花,26个兄弟姐妹是一家,大写字母与小写字母不分家。试编一程序,按顺序输出26个小写英文…

linux配置大数据环境

linux配置大数据环境 修改主机名 hostnamectl set-hostname xxx配置 yum [rootlocalhost ~]# mkdir /mnt/cdrom [rootlocalhost ~]# df /mnt/cdrom 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda3 39517336 7718416 31798920 20% /[rootlocalhost…

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…

分布式链路追踪(一)SkyWalking(2)使用

一、使用方法 1、简介 agent探针可以让我们不修改代码的情况下&#xff0c;对Java应用上使用到的组件进行动态监控&#xff0c;获取运行数据发送到OAP上进行统计和存储。agent探针在Java使用中是使用Java agent技术实现。不需要更改任何代码&#xff0c;Java agent会通过虚拟…

js基础API初学

事件监听 目标&#xff1a;能够给DOM元素添加事件监听 ■ 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 • 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调…

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

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

泰勒级数、海森矩阵、雅可比矩阵

泰勒级数 一元泰勒级数展开说明 多元泰勒级数展开说明 海森矩阵 海森矩阵说明 雅可比矩阵 雅可比矩阵说明

web学习笔记(三十二)

目录 1.函数的call、apply、bind方法 1.1call、apply、bind的相同点 1.2call、apply、bind的不同点 1.3call、apply、bind的使用场景 2. 对象的深拷贝 2.1对象的浅拷贝 2.1对象的深拷贝 1.函数的call、apply、bind方法 1.1call、apply、bind的相同点 在没有传参数时&…

OpenXR 超详细的spec--Chapter 1 Introduce

1.什么是OpenXR OpenXR是XR应用的一个API&#xff0c;它是app与runtime进程内或者进程外的接口。Runtime可以处理类似frame composition&#xff0c;外围设备管理、原始tracking information的功能。 Optionally, Runtime可以支持device layer plugins&#xff0c;允许通过共同…

C语言宏定义,内置宏,__FILE__,__LINE__,## 用法

​ 当然宏定义非常重要的&#xff0c;它可以帮助我们防止出错&#xff0c;提高代码的可移植性和可读性等。 下面列举一些成熟软件中常用得宏定义 1&#xff0c;防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H//头文件内容 … #endif2&#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端口开始探索&…

ICSE 2024

Proceedings of the 46th IEEE/ACM International Conference on Software Engineering, ICSE 2024, Lisbon, Portugal, April 14-20, 2024. 第46届IEEE/ACM软件工程国际会议论文集&#xff0c;2024年4月14日至20日&#xff0c;葡萄牙里斯本。 1 Domain Knowledge Matters: Im…

网络原理(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;毕业论文降重…