MySQL-事务处理

news2024/11/21 1:45:15

MySQL事务

什么是事务

  • 数据中的事务是指数据库执行的一些操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功,部分失败的情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLsGXH4V-1681106231027)(MySQL事务.assets/image-20220921101516962.png)]

如果在事务的支持下,最终有两种结果:

  • 操作成功:A账户减少100,B账户增加100
  • 操作失败:A,B账户没有发生任何变化

事务的特征(ACID)

原子性(Atomicity)

事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果上来看的,从最终结果上来看的话这个过程是不可分割的

一致性(Consistency)

一个事务必须使数据库从一个一致性转换到另一个一致性的状态

一致性:

  • 从业务逻辑上来说,最终结果符合逻辑就是一致性

隔离性(Isolation)

一个事务的执行不能被其他事务干扰。事务与事务之间不能互相干扰。

持久性(Durability)

一个事务一旦提交了,对数据库中的数据来说应该是永久性的。当事务提交之后,数据会持久化到磁盘中,修改时永久性的。

MySQL中的事务操作

mysql中事务默认为隐式事务,执行insert,update,delete操作的时候,数据库会自动开启事务,提交或回滚事务

是否开始隐式事务时有变量autocommit控制的

隐式事务

隐式事务自动开启,提交或回滚,比如insert,update,delete语句,事务的开启,提交或回滚由mysql内部自动控制的

show variables like 'autocommit';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F03ZRvnW-1681106231028)(MySQL事务.assets/image-20220921103318480.png)]

autocommit为ON表示开启自动提交

显式事务

显式事务手动开启,提交和回滚,由开发者自动控制

方式1

语法:

//设置不自动提交事务
set autocommit  = 0;
//执行事务的操作
commit//提交事务
rollback//回滚事务

示例1:

create table test( a int);
窗口1窗口2
设置为不自动提交(set commit = 0)
insert into test values (10)
select * from test;(有数据10)select * from test;(没有数据10)
commit;
select * from test;(有数据10)select * from test;(有数据10)
insert into test values (11)
select * from test;(有数据11)select * from test;(没有11)
rollback;(回滚)
select * from test;(没有数据11)select * from test;(没有数据11)

autocommit:还原

-- 自动提交事务
set autocommit  = 1;

方式2

语法:

-- 开启事务
start transaction ;
-- 执行事务
-- 提交事务
commit ;
-- 回滚事务
rollback ;

案例1:

窗口1窗口2
show variables like ‘autocommit’;(默认开启)show variables like ‘autocommit’;(默认开启)
start transaction ;(开启事务)
insert into test values (11);
select * from test;(没有数据)select * from test;(没有数据)
commit;
select * from test;(有数据)

案例2:

窗口1窗口2
show variables like ‘autocommit’;(默认开启)show variables like ‘autocommit’;(默认开启)
start transaction ;(开启事务)
delete from test where a = 11;
select * from test;(数据不存在11)select * from test;(数据存在11)
rollback;(回滚)
select * from test;(数据存在11)select * from test;(数据存在11)

savepoint关键字

示例:

窗口1窗口2
show variables like ‘autocommit’;show variables like ‘autocommit’;
start transaction ;(开启事务)
insert into test values (4);
savepoint insert_save1;(设置一个保存点insert_save1)
delete from test where a = 10;
savepoint delete_save2;
rollback to delete_save2;
commit;
select * from test;(有10数据)select * from test;(有10数据)

只读事务

表示在事务中执行的是一些只读操作,比如查询,但不会做insert,update,delete操作,数据库内部对只读事务可能回有一个性能上的优化

用法:

start transaction read only ;

示例:

-- 提交事务
commit ;

-- 开启只读事务
start transaction read only ;

select * from test;

-- 删除全部数据
delete from test;
-- 只读状态无法删除数据
[25006][1792] Cannot execute statement in a READ ONLY transaction.
-- 提交事务
commit ;

select * from test;

只读事务中执行delete操作会报错: 只读状态无法删除数据

脏读

# 设置脏读
set session transaction isolation level read uncommitted;

脏读是指在数据库中,一个事务读取了另一个事务未提交的数据。

如果这些未提交的数据被回滚了,那么第一个事务读取的数据就是无效的。

读已提交

set session transaction isolation level read committed ;

一个事务操作过程中可以读取到其他事务已提交的数据

事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(当前读)

可重复读

一个事务操作中对应一个读取操作不管多少次,读到的数据结果始终都是一样的

幻读

幻读在可重复度的模式下才会出现的,其他隔离隔离级别中不会出现

例如:

在可重复读模式下,如有用户表,手机号为主键,两个数据操作:

事务1:

  • 打开只读事务
  • 查询电话号码为x的存在,发现不存在
  • 插入电话号码为x的数据,插入报错
start transaction read only ;

select * from user1 where iphone = 120;

insert into user1 values ('zhangsan',110);

commit ;

事务2:

对于事务2操作来说,发生幻觉了一样,

start transaction ;

insert into user1 values ('zhangsan',120);

select * from user1 where iphone = 120;

commit ;

事务中后面的操作(插入电话号码数据)需要提交事务之后才可以支持,对于事务2来说可以添加数据,但是不能查询数据,

事务的隔离级别

隔离级别分为4种:

  • 读未提交:READ-UNCOMMITED
  • 读已提交: READ-COMMITTED
  • 可重复读: REPEATABLE-READ
  • 串行: SERIALIZABLE

当多个事务同时进行的时候,如何确保当前事务种数据的正确性,不如A,B两个事务同时进行的时候,A是否可以看到B已提交事务或者未提交事务,需要看到的话依靠隔离界别来保证,不同隔离级别可以产生的效果不一样。

事务的隔离级别主要解决了多个书屋之间数据可见性和数据正确性的问题。

查看隔离级别

show variables like 'transaction_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Uc1tYcC-1681106231028)(MySQL事务.assets/image-20220921115220437.png)]

当前隔离级别为可重复读

隔离级别的设置

READ-UNCOMMITTED:读未提交

修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini文件,设计隔离级别

# 设置为读未提交
transaction-isolation=READ-UNCOMMITTED

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qzSQMPfy-1681106231029)(MySQL事务.assets/image-20220921160453951.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTEnSswz-1681106231029)(MySQL事务.assets/image-20220921160445810.png)]

修改完成后重启mysql服务

C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。

修改完成后查看隔离级别

show variables like 'transaction_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChpJt2V4-1681106231030)(MySQL事务.assets/image-20220921162553097.png)]

按照时间顺序在2个窗口执行

时间窗口1窗口2
T1start transaction ;
T2select * from test;
T3start transaction;
T4insert into test values(1);
T5select * from test;
T6select * from test;
T7commit;
T8select * from test;
T9commit;

窗口1可以读取到窗口2未提交的数据,说明出现了脏读

结论:

  • 在读未提交的情况下,可以读取到其他事务还未提交的数据,多次读取,出现脏读,不可重复读

READ-COMMITED:读已提交

# 设置为读已提交

transaction-isolation=READ-COMMITTED

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jST1riXi-1681106231031)(MySQL事务.assets/image-20220921170222309.png)]

C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
# 查看隔离级别
show variables like 'transaction_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MfqEZQPF-1681106231031)(MySQL事务.assets/image-20220921170740411.png)]

按照时间顺序在2个窗口执行

时间窗口1窗口2
T1start transaction ;
T2select * from test;
T3start transaction;
T4insert into test values(1);
T5select * from test;
T6select * from test;
T7commit;
T8select * from test;
T9commit;

窗口1开启事务,无法读取到窗口2未提交的数据,说明没有脏读

窗口2提交事务后,窗口1则可以读取到数据。

结论:

  • 在读已提交的情况下,无法读取到其他窗口未提交的数据,可以读取到已提交的数据

REPEATABLE-READ:可重复读

# 设置为可重复读
transaction-isolation=READ-COMMITTED
C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
# 查看隔离级别
show variables like 'transaction_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7mrAWMZT-1681106231031)(MySQL事务.assets/image-20220921171717569.png)]

按照时间顺序在2个窗口执行

时间窗口1窗口2
T1start transaction ;
T2select * from test;
T3start transaction;
T4insert into test values(1);
T5select * from test;
T6select * from test;
T7commit;
T8select * from test;
T9commit;
T10select * from test;

窗口2未提交事务,窗口1无法查找未提交数据:未出现脏读

窗口2提交事务后,窗口1依旧无法查看数据

窗口1提交事务后,窗口1可以查看窗口2提交的事务数据

SERIALIZABLE:串行

SERIALIZABLE会让并发的事务串行执行(多个事务之间读写,写读,写写会产生互斥,这个效果就是串行执行,多个事务之间读读操作不会产生互斥)

读写互斥:事务1中先读取操作,事务2发起写入操作,事务1中的读取会导致事务2中的写入处于等待状态,直到事务1完成为止;

# 设置串行
transaction-isolation=SERIALIZABLE
C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
# 查看隔离级别
show variables like 'transaction_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8HQRWbl-1681106231032)(MySQL事务.assets/image-20220921173454449.png)]

按照时间顺序在2个窗口执行

时间窗口1窗口2
T1start transaction ;
T2select * from test;
T3start transaction;
T4insert into test values(1);
T5
T6commit;
T7commit;

隔离级别为串行状态下,事务只能串行执行,串行情况下不存在脏读,不可重复读,幻读的问题

各个隔离级别中出现的问题

隔离级别脏读不可重复读幻读
读未提交READ-UNCOMMITED
读已提交READ-COMMITTED
可重复读REPEATABLE-READ
串行SERIALIZABLE

总结

事务的特性:原子性,隔离性,一致性,持久性

是否开启自动提交事务:set autocommit = 0 :手动,1 :自动;

开启事务: start transcation

开启只读事务:start transcation read only;

提交事务:commit;

回滚事务:rollback;

设置保存点:savepoint (name);

回滚保存点:rollback to (name);

查看隔离级别:show variables like ‘transaction_isolation’;

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

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

相关文章

推荐一款 AI 脑图软件,助你神速提高知识体系搭建

觅得一款神器,接近我理想中,搭建知识体系的方法,先来看视频作为数据库开发或管理者,知识体系搭建尤为重要。来看看近些年缺乏足够数据库知识面造成的危害:a/ 数据安全风险:例如,2017年Equifax数…

Dubbo之认识RPC架构

文章目录一、互联网架构演变1.1 RPC架构1.2 SOA架构1.3 微服务架构1.4 SOA vs 微服务二、RPC 基本概念2.1 RPC 协议2.2 RPC 框架2.3 RPC 运行流程2.4 RPC vs HTTP提示:以下是本篇文章正文内容,Dubbo 系列学习将会持续更新 官方文档:https://c…

电池连接接触电阻的优化研究

金属与金属接触处的接触电阻主要受以下因素影响: 表面结构机械负载 表面结构可以通过表面平整度、表面氧化和吸水性进一步描述。 电池组中的这些接头将采用焊接或螺栓连接方式。最初最容易想到的是螺栓母线接头。 螺栓扭矩可用于估算力,从而估算接触压…

mvc的编辑和删除

之前实现了mvs的翻页登录显示等等一系列操作,现在我们再照葫芦画瓢实现一下编辑和删除。 1、编辑 我的思路是首先在list页面要给出编辑的超链接按钮,点击后跳转到一个jsp页面用来输入编辑的相关内容,再提交到负责编辑功能的servlet中。 首…

双硬盘安装Ubuntu22

1、下载Ubuntu系统的iso文件 官方下载地址:Download Ubuntu Desktop | Download | Ubuntu 阿里云镜像下载地址:ubuntu-releases安装包下载_开源镜像站-阿里云 2、制作U盘引导盘 下载软件 Rufus:https://rufus.akeo.ie 绿色免安装&#xff0…

Spring Security源码剖析从入门到精通.跟学尚硅谷(二)

Spring Security源码剖析从入门到精通.跟学尚硅谷 二4. SpringSecurity 微服务权限方案4.1 什么是微服务1、微服务由来2、微服务优势3、微服务本质4.2 微服务认证与授权实现思路1、认证授权过程分析2、权限管理数据模型3、项目技术说明4、搭建工程(1).创建父工程(2).创建子模块…

2023年天猫青团销售数据:口味更个性化,但老字号品牌依然称霸

青团本是清明时节祭祀的产物,但随着时节的推移,青团已经突破了地域与时间的限制,如今的青团已经成为地域性特色小吃的一种,并逐渐被全国消费者所接受。 随着消费回暖及内容营销的助力,今年的青团季比往年相比提高了不少…

天气预报查询 API + AI 等于王炸(一大波你未曾设想的天气预报查询 API 应用场景更新了)

前言 近年来,随着信息化进程的不断深入,人们对于信息的获取和处理需求越来越高。而其中,天气查询API是一个非常重要的服务,它能够帮助人们快速获取所在位置的天气情况,同时也为各类应用提供了必要的气象数据支持。 本…

Vue组件化编程

模块与组件、模块化与组件化 传统方式编写应用 使用组件方式编写应用 模块 理解:向外提供特定功能的 js 程序,一般就是一个 js 文件为什么:js 文件很多很复杂作用:复用 js,简化 js 的编写,提高 js 运行效…

RabbitMQ( 发布订阅模式 ==> TopicExchange)

本章目录: 何为TopicExchangeTopicExchange的具体使用一、何为TopicExchange 老样子,先看官方文档 在DirectExchange中,我们可以发送携带routingkey的消息到交换机中,交换机通过routingkey再去匹配一个或多个符合条件的队列。 …

不要告诉同事你要离职!打算跳槽,新公司开出两倍薪资,私下告诉要好的同事,却被同事出卖给领导!...

职场上有真正的朋友吗?来看看这位网友的讲述:一位前同事本来打算跳槽,新公司开出的薪资是原来的两倍。她私下告诉了几位同事自己打算离职的消息,并跟同事们分享了工资翻倍的喜悦。可她万万没想到,两天之后的公司会议上…

VSCode 配置arduino 开发

下载扩展,Arduino 其次,找到ta,看图片设置 配置完上述两个步骤后VS Code底部出现一个菜单栏,如下; 首先的有一个电灯的项目,我们可以去Arduino IDE 的示例中 另存一份出来 ,通过VSCode打开&am…

mysql 主从同步案例集合

记一次 MySQL 主从同步异常的排查记录,百转千回! relay log 损坏了,导致从库的 SQL 线程解析 relay log 时出现异常。从库恢复方式是通过手动设置当时出错的 GTID 的下一个值,让从库不从主库同步这个 GTID,最后从库就能…

Hadoop集群启动后,在web:50070端口只有两个datanode节点

spark集群部署规划: hadoop1 master worker datanode namenode secondarynamenode(hadoop) resourcemanager nodemanager(yarn) hadoop2 worker datanode nodemanager hadoop3 worker datanode nodemanager 问题引出:​​​​​​Hadoop集群启…

Java对象模型

介绍 Java是一种面向对象的语言,而Java对象在JVM中存储是由一定结构的。而这个 Java对象自身的存储模型称之为Java对象模型HotSpot虚拟机中,设计了一个OOP-Klass Model.OOP指的是普通对象指针,而Klass用来描述对象的具体类型。如下图所示是一…

字节测试总监8年测试路,如何从功能测试转成自动化测试——愿测试人不再迷茫

我大学学的计算机专业,有一点编程基础。我的软件测试职业开始和大多数测试人员一样,一开始在一家电商公司做软件功能测试。 大部分进入测试行业的朋友,最开始接触都是纯功能界面测试,随着工作年限,会接触到一些常用测…

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面部表情,让机…

北邮22信通:(13)二叉树 统计结点总数 深度和叶子结点数

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章: 下一篇文章: 目录 一.统计结点总个数 二.统计二叉树深度 三.统计叶子结点总数 四.完整代码 4.1测试int存储类型&…

基于via的课堂学生行为数据标注 与yolov7目标检测与自动标注系统

目录0 相关链接1. 总体功能描述2.软件安装说明2.1. 环境搭建2.2. 激活环境2.3. 退出环境2.4. 删除环境2.5. 安装opencv3.标注数据处理3.1. 收集3.2.via对标注举手3.3. via 举手标注转化yolo格式3.4. via动作标注扩展3.5. via 举手看书写字标注转化yolo格式4. 标注数据检查与可视…

Vue3.0中的响应式原理

回顾Vue2的响应式原理 实现原理: - 对象类型:通过 Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。 - 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹&…