【MySql】MySql事务常见操作

news2024/9/21 3:22:31

文章目录

  • 准备工作
  • 事务常见操作方式
  • 总结

准备工作

  • 将mysql的默认隔离级别设置成读未提交
set global transaction isolation level read uncommitted;

注意:设置完毕之后,需要重启终端,进行查看

select @@tx_isolation  

image-20230622140407021

  • 创建测试表
mysql> create table if not exists account(
    -> id int primary key,
    -> name varchar(50) not null default '',
    -> blance decimal(10,2) not null default 0.0
    -> )engine=InnoDB default charset=utf8;
Query OK, 0 rows affected (0.22 sec)

image-20230622141430469

并且同时启动两个客户端,即两个SSH渠道。

事务常见操作方式

先查看当前事务的提交方式:这里我们之前设置成自动提交了

show variables like 'autocommit';

image-20230622141816384

启动事务:

-- 方式一
start transaction;

-- 方式二
begin;

image-20230622142057087

创建一个保存点:

savepoint s1;

现在,我们给一端插入数据并且设置保存结点:

image-20230622142917442

此时的account表中的数据如下:

image-20230622143037442

现在,事务进行回滚rollback to s3:

image-20230622143110374

此时的account表中的王五这条数据就没有了:

image-20230622143146967

如果回滚到上面设置的保存点s1,那么account表中的数据自然就没有了。这就是回滚事务。

结束事务:

commit;

image-20230622143452044

  • 这上面的操作是设置保存点的,如果没有保存点

image-20230622143846543

此时查看表account的数据:数据全没了

image-20230622143912347

直接rollback,把从开始启动事务的所有操作全部丢弃。

  • 事务持久化

image-20230622144356575

此时再来查看表account:

image-20230622144416315

此时即使后续在进行rollback操作,也没有影响了。

此时的数据永久化保存在数据库里了。也就是事务一经提交,就没办法再回滚了。也就是回滚只能在事务运行进行的期间,事务提交之后,无法回滚

  • **事务运行期间出现异常,客户端崩溃,MySQL自动会回滚 **

先来看一下现在有一个表account,以及两个客户端,也就是以下的情况:(注意,事务是自动提交的show variables like ‘autocommit’;)

image-20230622145054134

现在来看一下客户端崩溃,自动回滚的情况:

ctrl + \ 异常终止MySQL

image-20230622145818129

另外,只要把事务统一commit之后,这个数据就直接被插入到数据库中,并不会因为客户端崩溃这种情况而出现数据回滚。

  • 证明begin操作会自动更改提交方式,不会受MySQL是否自动提交影响

关闭自动提交

set autocommit=1;

image-20230622152011463

插入数据commit后客户端崩溃:

image-20230622153003532

此时的田七这条数据是存在的了

image-20230622153018640

  • 证明单条 SQL 与事务的关系

场景一:先关闭自动提交

image-20230622155411793

account表中的数据如下:

image-20230622155601704

现在执行单sql语句:数据被删除,但是如果aborted,当前的数据会自动回滚!

image-20230622160006429

场景二:先打开自动提交

image-20230622160328330

表account的数据如下:

image-20230622160358774

现在执行单sql,aborted之后,删除就是删除了

image-20230622162242486

autocommit会影响之前的单sql,每条sql就相当于事务,虽然没有写begin,没有写commit。单sql执行的时候,如果autocommit是off的,只是事务执行中,当这个客户端崩溃的时候,数据会回滚。如果autocommit是on的,信息直接提交到数据库进行持久化。

单sql也是事务,是自动提交的。如果autocommit是off关闭的,当sql执行后再commit之后数据就是持久化了。

总结

结论

只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。

事务可以手动回滚,同时,当操作异常,MySQL会自动回滚

对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交,除非把autocommit改成OFF。(select有特殊情况,因为MySQL 有 MVCC )

从上面的例子,我们能看到事务本身的原子性(回滚),持久性(commit)

事务操作注意事项

如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)
如果一个事务被提交了(commit),则不可以回退(rollback)
可以选择回退到哪个保存点
InnoDB 支持事务, MyISAM 不支持事务
开始事务可以使 start transaction 或者 begin,结束使用commit,建议使用begin,毕竟比较容易记住

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

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

相关文章

HTML5 的新特性

html基础知识html基础知识_上半场结束,中场已休息,下半场ing的博客-CSDN博客html5的新特性HTML5 的新特性_上半场结束,中场已休息,下半场ing的博客-CSDN博客 目录 1.0 HTML5 的新特性 1.1 HTML5 新增的语义化标签 1.2 HTML5 新增的…

LabVIEW何得知是谁在连接远程前面板

LabVIEW何得知是谁在连接远程前面板 想要知道连接远程前面板的用户的身份。如何来得知用户的身份和他们连接远程前面板的时间? 解答: 可以使用Remote Panel: Connections To Clients属性或者Remote Panel Client Connections方法来得知连接远程面板用户的身份。Re…

TypeScript ~ TS 掌握编译文件配置项 ⑤

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…

【2023,学点儿新Java-20】流程控制语句关键字及其介绍:while、do、break、continue、return

前情回顾: 【2023,学点儿新Java-19】Java特殊空类型关键字 | Java流程控制语句关键字 | switch-case 选择结构的执行过程&注意点 | 详解:for循环的普通和增强版本【2023,学点儿新Java-18】Java关键字汇总说明 |附&#xff1a…

chatgpt赋能python:Python新手常见的报错提示及解决方法

Python新手常见的报错提示及解决方法 Python是一种非常流行的编程语言。对于新手来说,Python在学习过程中可能会遇到许多报错提示,这些提示可能会让人感到很困惑。本文将介绍Python新手常见的报错提示,并提供解决方法。 IndentationError: …

ninja的简单使用

文章目录 Ninja安装windows环境Linux环境 入门使用与CMake一起使用 Ninja安装 windows环境 问题的解决通常有多种方法。按照结果的好坏程度,可以将解决方法简单的划分为,上中下三个层次,见:为什么谋士总喜欢提上中下三策? 在w…

SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

SpringBoot 如何使用 RestControllerAdvice 注解进行 RESTful 异常处理 在 SpringBoot 应用程序中,RESTful 异常处理是一个非常重要的话题。当 RESTful API 出现异常时,我们需要对异常进行处理,以保证 API 的稳定性和可靠性。SpringBoot 提供…

【SpringBoot】SpringBoot的发展沿革,相关介绍,特点,重要策略以及安装步骤讲解

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

Java·Map和Set

文章目录 🏯1. 搜索🏯1.1 概念及场景1.2 模型 🏰2. Map 的使用🏰2.1 关于Map的说明2.2 关于Map.Entry的说明2.3 Map 的常用方法说明2.4 TreeMap的使用案例2.5HashMap源码分析 ⛺️3. Set 的说明⛺️3.1 常见方法说明 &#x1f3ed…

设计模式—访问者模式

需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 public class Fruit {private String name;private Date pickDate;public Fruit(String name, Date pickDate) {this.name name;this.pickDate pic…

【Unity之IMGUI】—位置信息类和控件基类的封装

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏: ⭐…

出现线程死锁缺陷一般有那些原因?该怎么解决?

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言什么是线程死锁线程…

【Python】文件操作 ⑤ ( 文件操作 | 以只读模式向已有文件写入数据 | 以追加模式向已有文件写入数据 | 以追加模式打开一个不存在的文件 )

文章目录 一、向文件写出数据1、以只读模式向已有文件写入数据2、以追加模式向已有文件写入数据3、以追加模式打开一个不存在的文件 一、向文件写出数据 1、以只读模式向已有文件写入数据 使用 write 函数向已有文件写入数据 , 会清空该文件中的数据 , 代码展示如下 : file1.t…

当mysql遇上PHP

一.利用PHP连接mySQL数据库 这要从一个故事说起。 某一天,一位名叫MySQL的农夫的一把斧子(数据库操作)掉进了一条名为PHP的河里,这时候,一位好心的河神出现了 PHP河的河神问他。。。。 下面,咱们还是说正经…

Kubernetes API Server源码学习(三):KubeAPIServer、APIExtensionsServer、AggregatorServer

本文基于Kubernetes v1.22.4版本进行源码学习 9、KubeAPIServer GenericAPIServer提供了一些通用的功能,其他的Server基于GenericAPIServer进行拓展,代码量就会减少许多 KubeAPIServer负责处理Kubernetes内建资源的REST请求,比如Pod、Deploy…

C/C++系列系统学习目录

友情链接:专栏地址 文章目录 一、C语言篇二、C篇 编程规范:C/C语言编程规范 一、C语言篇 章节内容1.初识C语言【C语言篇】初识C语言2.C语言最基础入门【C语言篇】C语言最基础入门3.C语言的输入输出相关知识【C语言篇】C语言的输入/输出相关知识4.C语言…

【Pytest实战】Pytest+Allure+Jenkins自动化测试框架搭建

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

从零开始理解Linux中断架构(5)--EL跃迁与Linux用户/内核态

ARM64系统Reset时,PE进入最高的异常级别运行状态 1)Reset后最高异常级别可以选用任何一种运行状态 2)cold reset由输入信号配置,warm reset由RMR_ELx.AA64配置 1)内核态EL1迁移到EL0t 上一节我们提到需要仔细理解的图吗?eret这条特殊的异常返回指令。 我们期望…

《机器学习公式推导与代码实现》chapter14-CatBoost

《机器学习公式推导与代码实现》学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅。 CatBoost CatBoost是俄罗斯搜索引擎巨头Yandex于2017年开源的一款GBDT计算框架,因能够高效处理数据中的类别特征而取名为CatBoost(C…

一时兴起之matlab学习记录

是学习记录,会有错误的地方 安装的话看其他文章把 小操作 查看历史命令 在输入命令的地方,按下↑的方向键即可 变量 对大小写敏感若想以指定的类型存储就是 类型名(值),如 int16(4),这个也可以强转变量名字有限制,键入namele…