MySQL中的事务详解

news2024/10/6 6:03:44

目录

一.什么是事务

二.事务操作

 演示

 小结

三.事务的特性

四.事务的隔离级别

概述

四种隔离级别

脏读、不可重复读、幻读

操作


 

一.什么是事务

  • 在MySQL中的事务(Transaction)是由存储引擎实现的,在MySQL中,只有InnoDB存储引擎才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的sQL语句要么全部执行,要么全部不执行。
  • 事务用来管理DDL、DML、DCL操作,比如insert,update,delete语句,默认是自动提交的。

 比如:在银行转账时,必须保证转账绝对安全,这时需要事务参与

 -- id为1的账户转账给id为2的账户
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;

思考

假如在第一次update之后,出现了意外、异常,没有执行第二次update,这时转账是否会出现异常?

二.事务操作

MySQL的事务操作主要有以下三种

1.开启事务:start Transaction

  • 任何一条DML语句( insert、update、delete)执行,标志事务的开启
  • 命令:BEGIN 或 START TRANSACTION

2.提交事务:commit Transaction

  • 成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
  • 命令:COMMIT

3.回滚事务

  • 失败的结束,将所有的DML语句操作历史记录全部清空
  • 命令:ROLLBACK

之前的所有SQL操作其实也有事务,只是MysQL自动帮我们完成的,每执行一条SQL时MySQL就帮我们自动提交事务,因此如果想要手动控制事务,则必须关闭MySQL的事务自动提交。
在MySQL中直接用SET来改变MySQL的自动提交模式:

 演示

create database test_transaction;
use test_transaction;

create table account(
	id int primary key,
	name varchar(20),
	money double

);

insert into account values(1,'张三',1000),(2,'李四',1000);

-- 设置MySQL的事务为手动提交(关闭自动提交)
select @@autocommit;-- 输出1指开启
set autocommit=0;

-- 模拟账户转账
-- 开启事务
begin;
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;
-- 提交事务
commit;

-- 回滚事务
rollback;

select * from account a ;

不提交直接查询的结果是

 但是

 在图形上数字需要提交后才可以正常显示

 这是因为select查的是最新的内存上的变化

当开启事务还未提交之前,执行回滚事务语句,那么就会撤销开启事务中执行的语句

 小结

begin开启后要么commit提交落盘要么rollback回滚落盘,先运行开启,在执行SQL语句,最后执行commit或者rollback

三.事务的特性

1.原子性

事务是一个不可分割的整体,事务开始后的所有操作,要么全部完成,要么全部不做

2.一致性

系统从一个正确的状态,迁移到另一个正确的状态

3.隔离性

每个事务的对象对其他事务的操作对象互相分离,事务提交前对其他事务不可见

4.持久性

事务一旦提交,则其结果是永久性的

四.事务的隔离级别

概述

lsolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题。

 如上图,越往上两个事务之间的关联程度越紧密,越往下越安全但效率越低。

四种隔离级别

1、读未提交(Read uncommitted)
一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读。
2、读已提交(Read committed)
一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读。
3、可重复读(Repeatable read)
就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生,但是会造成幻读。
4、串行(Serializable)
是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

 Mysql的默认隔离级别是Repeatable read

事务隔离级别脏读不可重复读幻读
读未提交(Read uncommitted)
读已提交(Read committed)
可重复读(Repeatable read)
串行(Serializable)

脏读、不可重复读、幻读

脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。

不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

不可重复读和幻读比较:
两者有些相似,但是前者针对的是update或delete,后者针对的insert。

操作

-- 查看隔离级别
show variables like '%isolation%';

-- 设置隔离级别
/*
 set session transaction isolation level 级别字符串
 级别字符串:read uncommitted、read committed、repeatable read、serializable
 */

-- 设置read uncommitted 
set session transaction isolation level read uncommitted;
-- 这种隔离级别会引起脏读,A事务读取到B事务没有提交的数据

-- 设置read committed
set session transaction isolation level read committed;
-- 这种隔离级别会引起不可重复读,A事务在没有提交事务之前,可看到数据不一致


-- 设置repeatable read(MysQ默认的)
set session transaction isolation level repeatable read;
-- 这种隔离级别会引起幻读,A事务在提交之前和提交之后看到的数据不一致

-- 设置serializable
set session transaction isolation level serializable;
-- 这种隔离级别比较安全,但是效率低,A事务操作表时,表会被锁起,B事务不能操作。

 

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

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

相关文章

【动态规划】背包问题题型及方法归纳

背包问题的种类 背包问题是在规定背包容量为j的前提下,每个物品对应的体积为v[i],价值为w[i],从物品0到物品i中选择物品放入背包中,找出符合某种要求的价值。 (1)背包问题种类 01背包:每种物…

访学案例|经济学老师加急英签如期出国

N老师是学校资助的公派访学,指定英国,要求年底前出国。经过努力,我们为其落实了经济学学术研究排名位列全英第五的埃塞克斯大学。为保证预留充足的准备时间,N老师选择了超级加急的AV签证,24小时过签,最终如…

基于 VPX 总线的工件台运动控制系统研究与开发-以光刻运动台为例(一)

工件台系统是光刻机的关键子系统之一,工件台运动控制系统对实现光刻机性能指标具有至关重要的作用,因此研发工件台运动控制系统具有极其重要的工程应用价值。论文根据工件台控制系统必须具备的并行性、同步性和实时性等技术需求,建立了基于 V…

【Kubernetes】CI/CD 简介与 ECS 服务规划

一,前言 去年公司上了一个持续集成平台,设计技术组件与开源工具集,大致如下: 使用 Gitlab 作为代码的管理和托管工具;使用 Gitlab CI 持续集成工具;使用 Docker 开源应用容器引擎;使用 Harbor…

ABO溶血症概率

[简介]ABO溶血是由于母亲和胎儿ABO血型不合引起的新生儿溶血,概率不是很大,一般出现在准妈妈是O血,准爸爸是非O血,这次容易发生血型不合,但新生儿ABO溶血概率不高,大多数症状相对较轻。ABO溶血的概率是什么…

2023美赛必须注意事项

文章目录首页部分要求竞赛期间题目查看题目下载论文要求比赛提示控制号提交解决方案更多注意事项首页部分要求 具体如下: 我提取一些关键词如下: 第一页:摘要页字体要求:12点的 Times New Roman 字体请勿在此页面或任何页面上…

几种在Linux/window下查询外网IP的办法。

hello world curl ifconfig.me/ip如下图 1. 纯文本 https://ifconfig.me/ip https://ipinfo.io/ip 或 https://ipecho.net/ip 或 https://ipecho.net/plain https://www.trackip.net/ip https://icanhazip.com 2. JSON格式 https://ifconfig.me/all.json https://ipi…

见微可视化平台研究(一)

1. Python项目部署 使用容器部署 将Dockerfile拷贝道algo目录: # docker build -t algo:v1 . # docker run -d -p 5000:5000 algo:v12. 部署依赖数据库 2.1 MySQL初始化 MySQL安装忽略,初始化脚本: backend/datascience-service/src/mai…

从0到1一步一步玩转openEuler--16 openEuler使用DNF(YUM)管理软件包组

文章目录16.1 列出软件包组清单16.2 显示软件包组信息16.3 安装软件包组16.4 删除软件包组DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,…

扬帆策略|10万亿市场疯狂反攻,撑爆5万人,大牛市要来了?

今日商场太强了,很多财物都在猛涨,有一种牛市已来的感觉! 首先,来看一向被我们视为核心财物的茅台酒价。据白酒数据渠道“不贰酱”音讯,今日茅台酒行情价全线大涨。飞天方面,全系列又有20元/瓶的涨幅&#…

c++11 标准模板(STL)(std::multimap)(八)

定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…

Compose Recomposer启动流程分析

初始组合流程开始的第一步就是创建 Recomposer 。 接着 Recomposer 又作为构造参数创建了 CompositionImpl 、 ComposerImpl &#xff0c;又在 AndroidComposeView#onAttachedToWindow() 触发 onViewTreeOwnersAvailable 回后&#xff0c;调用 composeInitial() 开启初始组合。…

java连接docker里面的hbase

原代码代码一直卡着报错如下&#xff1a;java.io.UncheckedI0Exception:org.apache.hadoop.hbase.client.RetriesExhaustedException: Cant get the location for replica 0at org.apache.hadoop.hbase.client.ResultScanner$1.hasNext(ResultScanner.java:55)at hbase.SelectS…

基于C++的考试系统

一、需求分析 ​ 设计一个简单的考试系统&#xff0c;可进行C与Java的考试&#xff0c;考生姓名、考生学号、C题目、Java题目、C答案&#xff0c;Java答案分别存入…/txt文件数据/路径下的StudentsName、StudentsNum、QuestionC&#xff0c;QuestionJ、AnswerC、AnswerJtxt文件…

【一般人不会告诉你】比肩chatgtp的5款AI网站

话不多说&#xff0c;直接上连接 1. Dall-E: https://labs.openai.com/ 2. Codeformer: https://shangchenzhou.com/projects/Co... 3. Playground AI: https://playgroundai.com/ 4. Clip Drop: https://clipdrop.co/relight 5. Astria: https://www.strmr.com/examples …

Apache服务关闭攻防场景模拟实验

一、场景概述 攻击机攻击已知的公共Apache web服务器&#xff0c;导致Apache服务关闭&#xff0c;web网站无法访问。攻击者利用安全外壳 (SSH) 暴力攻击访问服务器&#xff0c;并上传后门文件和脚本&#xff0c;每分钟将服务器的用户名称和密码发送给攻击机以保持对服务器的访…

【分享】如何通过集简云将ChatGPT人工智能接入到我们的抖音中?

ChatGPT是一款非常强大的人工智能产品&#xff0c;可以有创造性的回复和创作文字&#xff0c;图片&#xff0c;适用于很多办公场景。这篇文章将介绍如何将ChatGPT接入到我们的抖音中。 在集简云中的ChatGPT应用 目前集简云提供了两个ChatGPT应用: OpenAI(ChatGPT&#xff09;内…

什么是同步整流和异步整流

在设计降压型DCDC电路的时候&#xff0c;经常会听到同步整流&#xff08;synchronous&#xff09;和异步整流&#xff08;asynchronous&#xff09;。那么什么是同步整流&#xff0c;什么是异步整流呢从这两种电路的拓扑来看&#xff0c;异步整流型外围有一个续流二极管&#x…

07 OpenCV各类滤波

1 均值滤波 均值滤波器是一种基本的线性滤波器&#xff0c;常用于图像处理中的平滑操作。在 OpenCV 中&#xff0c;可以使用cv2.blur()函数或cv2.boxFilter()函数进行均值滤波操作。 均值滤波器的原理是将每个像素的灰度值替换为其周围像素灰度值的平均值。其核心思想是去除图…

Android App开发基础

文章目录一 App的开发特点1.1 App的运行环境1.2 App开发语言1.3 java语言开发1.4 Kotlin语言开发1.5 XML1.6 App连接的数据库二 App的工程结构2.1 App工程目录结构2.2 构建工具Grade2.3 编译配置文件build.gradle2.4 运行配置文件AndroidManifest.xml2.4.1 application2.4.2 ac…