当前位置: 首页 > news >正文

事务的使用

1.如何使用事务:

1.1.事务的完成过程:

  • 1.步骤1:开启事务
  • 2.步骤2:一系列的DML操作
  • 3.步骤3:事务结束状态:提交事务(COMMIT),中止事务(事务回滚ROLLBACK)

1.2.事务分类:

  • 事务有两种方式:
    • 1.显式事务
    • 2.隐式事务

2.显示事务与隐式事务的执行过程

2.1.显示事务的执行过程

a.步骤1:开启事务方式:

  • 1.START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务
  • 2.START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边可以跟随如下 修饰符
    • READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不能修改数据
      在这里插入图片描述
    • READ WRITE :(默认值)标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。
    • WITH CONSISTENT SNAPSHOT启动一致性读
  • 3.举例说明开启事务:
    在这里插入图片描述

b.步骤2:一系列DML操作

c.步骤3:提交事务(COMMIT)或中止事务(事务回滚ROLLBACK)

  • 1.savepoint:事务操作过程中的一个保存点,方便事务回滚到某个点的状态
    在这里插入图片描述
  • 2.其中关于SAVEPOINT的相关操作有
    在这里插入图片描述

2.2.隐式事务执行过程 :

a.关键字:autocommit

  • 1.隐式事务中的关键字: autocommit
  • 2.如下可以看出默认是开启隐式事务,所以在此时的每个DML操作都是自动提交的。
    在这里插入图片描述
  • 3.默认是ON,如果不显式的使用START TRANSACTION或者BEGIN语句开启一个事务,那么每一条DML语句都算是一个独立的事务,这种特性称之为事务的自动提交。也就是说,不以START TRANSACTION或者BEGIN语句显式的开启一个事务,那么下边这两条语句就相当于放到两个独立的事务中去执行
    UPDATE account SET balance = balance - 10 WHERE id = 1; #此时这条DML操作是一个独立的事务
    UPDATE account SET balance = balance + 10 WHERE id = 2; #此时这条DML操作是一个独立的事务
    

b.关闭隐式事务中的自动提交:

关闭 自动提交 的功能,可以使用下边两种方法之一:

b1.方式1:
  • 1.把系统变量 autocommit 的值设置为 OFF(针对于DML操作是有效的,对DDL操作是无效的),就像这样:SET autocommit = OFF; 或SET autocommit = 0;此时,下面的两个语句就不再每一条是事务,假设我后面再执行一条commit或者rollback,那么这两条语句就组合在一起,成为一个事务
    SET autocommit = OFF;
    #或
    SET autocommit = 0;
    
  • 2.这样的话,写入的多条语句就算是属于同一个事务了,直到我们显式的写出COMNIT语句来把这个事务提交掉,或者显式的写出ROLLBACK语句来把这个事务回滚掉
b2.方式2:
  • 1.显式的的使用 START TRANSACTION 或者 BEGIN 语句开启一个事务。这样在本次事务提交或者回滚前会暂时关闭掉自动提交的功能
    	START TRANSACTION;UPDATE account SET balance = balance - 10 WHERE id = 1;UPDATE account SET balance = balance + 10 WHERE id = 2; COMMIT; #或rollback;
    

补充: Oracle 默认不自动提交,需要手写COMMIT命令,而MySQL 默认自动提交

c.关闭隐式事务案例:

  • 方式1:使用SET autocommit = FALSE
#  如何关闭自动提交?
SET autocommit = FALSE; #针对于DML操作是有效的,对DDL操作是无效的。
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2; 
COMMIT; #或rollback;
  • 方式2:在autocommit为true的情况下,使用start transaction 或begin开启事务,那么DML操作就不会自动提交数据
START TRANSACTION;
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2; 
COMMIT; #或rollback;

3.隐式提交数据的情况都有哪些:

3.1.数据定义语言(Data definition language,缩写为:DDL

在这里插入图片描述

3.2.隐式使用或修改mysql数据库中的表

在这里插入图片描述

3.3.事务控制或关于锁定的语句

  • 1.当我们在一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了另一个事务时,会 隐式的提交 上一个事务 在这里插入图片描述
  • 2.当前的 autocommit 系统变量的值为 OFF ,我们手动把它调为 ON 时,也会 隐式的提交 前边语句所属的事务`
    SET autocommit = FALSE; 
    UPDATE account SET balance = balance - 10 WHERE id = 1;
    UPDATE account SET balance = balance + 10 WHERE id = 2; 
    SET autocommit = true;
    
    在这里插入图片描述
  • 3.使用 LOCK TABLES 、 UNLOCK TABLES 等关于锁定的语句也会 隐式的提交 前边语句所属的事务。

3.4.加载数据的语句:

  • 使用LOAD DATA语句来批量往数据库中导入数据的时候,就会隐式提交前面的所有语句

e.关于mysql的一些复制的一些语句:

在这里插入图片描述

3.5.其他一些语句:

在这里插入图片描述


5 .事务的使用举例:

5.1.举例1:体会提交与回滚

a.首先明确什么是下DML和DDL的不同:

在这里插入图片描述

b.语句操作:

use MyBatis;# 1.使用MyBatis库
CREATE TABLE user3(NAME VARCHAR(15) PRIMARY KEY);# 2.建表
SHOW VARIABLES LIKE 'autocommit';# 3.查看autocommit的,确保是on-------------------------------------------------------------------------------
# 情况一:
BEGIN;# 4.开启事务
INSERT INTO user3 VALUES('张三');# 5.插入语句,且不会自动提交数据,但是select可以查询到
COMMIT;# 6.提交数据,这次事务就完成了BEGIN; #7.再开启一个新的事务
INSERT INTO user3 VALUES('李五'); #8.此时不会自动提交数据
INSERT INTO user3 VALUES('李五'); #9.受主键的影响,不能添加成功
ROLLBACK;# 10.回滚到上次commit的地方,所以:数据库中仅有张三这一条数据-------------------------------------------------------------------------------
# 情况二:
TRUNCATE TABLE user3;  #清楚表数据,因为这个是DDL操作会自动提交数据,不会受autocommit变量的影响。BEGIN;#一次事务开始
INSERT INTO user3 VALUES('张三'); #此时不会自动提交数据
COMMIT;#事务完成,提交数据INSERT INTO user3 VALUES('李四');# 7.再次插入数据,语句前面没有写:begin,所以在默认情况下(即autocommit为true),DML操作也会自动提交数据INSERT INTO user3 VALUES('李四');# 8.因为name是主键,所以这里再插入询就报错了,即事务的失败的状态
ROLLBACK # 9.那么我们ROLLBACK,就会回到上次commit的地方,因为第7步有自动提交,所以就会回滚到这个地方。----------------------------------------------------------------------------------------
#情况三
RUNCATE TABLE user3;#1.清楚表数据
SELECT * FROM user3;#2.查看是否清楚成功SELECT @@completion_type;#定义变量,两个@@表示系统变量,默认值是0
SET @@completion_type = 1;# 开启链式BEGIN;#开启一个事务
INSERT INTO user3 VALUES('张三'); # 插入数据
COMMIT;#事务完成INSERT INTO user3 VALUES('李四');# 插入数据,隐式提交
INSERT INTO user3 VALUES('李四'); # 再次插入语句,报错
ROLLBACK;# 回滚到上次提交的地方
SELECT * FROM user3;# 查询表数据,发现现在表中只有张三一条数据,这个就是因为定义了变量的原因,下面来看下这个变量啥意思

c.针对上述案例3,说明下completion_type的值代表的含义:

  • 1.completion=0:这是默认情况。当执行COMNIT的时候会提交事务,在执行下一个事务时,还需要使START TRANSACTION 或者BEGIN来开启。
  • 2.completion=1:这种情况下,当提交事务后,相当于执行了COMMIT AND CHAIN,也就是开启一个链式事务,即提交事务之后会开启一个相同隔离级别的事务。
  • 3.completion=2:这种情况下CONMMIT=COMMIT AND RELEASE,也就是提交后,会自动与服务器断开连接
    在这里插入图片描述

5.2.举例2:体会INNODB 和 MyISAM

a.MyISAM:是不支持事务的

CREATE TABLE test1(i INT) ENGINE = INNODB;
CREATE TABLE test2(i INT) ENGINE = MYISAM;#针对于innodb表
BEGIN
INSERT INTO test1 VALUES (1);
ROLLBACK;
SELECT * FROM test1;#因为回滚了,所以就没有存储数据#针对于myisam表:不支持事务
BEGIN
INSERT INTO test2 VALUES (1);
ROLLBACK;
SELECT * FROM test2;#发现有一条数据,说明ROLLBACK没用,即不支持事务

5.3.举例3:体会savepoint:


CREATE TABLE user3(NAME VARCHAR(15),balance DECIMAL(10,2));# 创建表BEGIN #开启事务
INSERT INTO user3(NAME,balance) VALUES('张三',1000);# 插入一条数据
COMMIT;# 提交数据
SELECT * FROM user3; # 查询数据BEGIN;
UPDATE user3 SET balance = balance - 100 WHERE NAME = '张三';# 更改1
UPDATE user3 SET balance = balance - 100 WHERE NAME = '张三';# 又更改1
SAVEPOINT s1;# 此时设置保存点SELECT * FROM user3;//800元UPDATE user3 SET balance = balance + 1 WHERE NAME = '张三';# 再次update操作
ROLLBACK TO s1; #回滚到设置的保存点那一步,只是回滚,不会自动的提交,待回滚后,再自己输入语句继续进行操作ROLLBACK; # 继续执行回滚操作,又回到了最初的状态。
SELECT * FROM user3;# 查询确认是否回滚成功 1000元

相关文章:

事务的使用

1.如何使用事务: 1.1.事务的完成过程: 1.步骤1:开启事务2.步骤2:一系列的DML操作3.步骤3:事务结束状态:提交事务(COMMIT),中止事务(事务回滚ROLLBACK) 1.2.事务分类: …...

【免费】企业级大模型应用推荐:星环科技无涯·问知

无涯问知是星环科技发布的大模型应用系统,那么我们先简单了解下星环科技吧! 星环科技(股票代码:688031)致力于打造企业级大数据和人工智能基础软件,围绕数据的集成、存储、治理、建模、分析、挖掘和流通等数…...

从〇 搭建PO模式的Web UI自动化测试框架

Page Object模式简介 核心思想 将页面元素和操作行为封装在独立的类中,形成页面对象(Page Object)。每个页面对象代表应用程序中的一个特定页面或组件。 优点: 代码复用性高 页面对象可以在多个测试用例中复用。 易于维护 …...

在Ubuntu中重装Vscode(没有Edit Configurations(JSON)以及有错误但不标红波浪线怎么办?)

在学习时需要将vscode删除重装,市面上很多方法都不能删干净,删除之后拓展都还在。因此下面的方法可以彻底删除。注意,我安装时使用的是snap方法。 如果你的VScode没有Edit Configurations(JSON),以及有错误但不标红波浪线的话&…...

Oracle 用户-表空间-表之间关系常用SQL

问题: 当某一个表数据量特别大,突然插入数据一直失败,可能是表空间不足,需要查看表的使用率 用户-表空间-表之间关系:用户可以有多个表空间,表空间可以有多个表,表只能拥有一个表空间和用户 1.…...

家政服务管理系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,管理阿姨管理,家政公司管理,服务项目管理,家政预约管理,评价管理,留言板管理,系统管理 微信端账号功能包括…...

【算法】并查集的介绍与使用

1.并查集的概论 定义: 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成: …...

Shell——运算符

在 Shell 编程中,运算符用于执行各种类型的操作,如算术运算、字符串比较、文件测试等。以下是 Shell 中常用的运算符分类和示例: 1. 算术运算符 Shell 中使用 expr 或 $(( ... )) 来进行算术运算。 : 加法-: 减法*: 乘法/: 除法%: 取余**:…...

SweetAlert2

1. SweetAlert2 SweetAlert2是一个基于JavaScript的库, 用于在网页上替换标准的警告框(alert), 确认框(confirm)和提示框(prompt), 并提供更加美观和用户友好的界面.需要在项目中引入SweetAlert2, 可以通过CDN链接或者将库文件下载到你的项目中来实现这一点. 通过CDN引入:<…...

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…...

Java版自动化测试之Selenium

1. 准备 编程语言&#xff1a;Java JDK版本&#xff1a;17 Maven版本&#xff1a;3.6.1 2. 开始 声明&#xff1a;本次只测试Java的Selenium自动化功能 本次示例过程&#xff1a;打开谷歌游览器&#xff0c;进入目标网址&#xff0c;找到网页的输入框元素&#xff0c;输入指…...

【计算机网络】——计算机网络的性能指标

速率&#xff08;speed&#xff09; 连接在计算机网络上的主机在数字信道上传送数据的速率。 影响条件&#xff1a; 带宽&#xff08;band width&#xff09; 指在固定的时间可传输的资料数量 单位&#xff1a;bps或HZ 吞吐量&#xff08;throughtput&#xff09; 指对网络、…...

MongoDB数据类型介绍

MongoDB作为一种高性能、开源、无模式的文档型数据库&#xff0c;支持丰富的数据类型&#xff0c;以满足各种复杂的数据存储需求。本文将详细介绍MongoDB支持的主要数据类型&#xff0c;包括数值类型、字符串类型、日期和时间类型、布尔类型、二进制类型、数组、对象以及其他扩…...

【SpringBoot】SpringBoot 中 Bean 管理和拦截器的使用

目录 1.Bean管理 1.1 自定义Bean对象 1.2 Bean的作用域和生命周期 2.拦截器的使用 1.Bean管理 默认情况下&#xff0c;Spring项目启动时&#xff0c;会把我们常用的Bean都创建好放在IOC容器中&#xff0c;但是有时候我们自定义的类需要手动配置bean&#xff0c;这里主要介绍…...

Spring IoCDI(中)--IoC的进步

通过上文的讲解和学习, 我们已经知道了Spring IoC 和DI的基本操作, 接下来我们来系统的学习Spring IoC和DI 的操作. 前⾯我们提到IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对 象&#xff0c;也就是bean的存储。 1. Bean的…...

读软件开发安全之道:概念、设计与实施02经典原则

1. CIA原则 1.1. 软件安全都构建在信息安全的三大基本原则之上&#xff0c;即机密性(confidentiality)、完整性(integrity)和可用性(availability) 1.2. 双方交换的数据 1.2.1. 从技术上看&#xff0c;端点之间的数据交换本身就会削弱交互的机密性 1.2.2. 隐藏通信数据量的一…...

MySQL中处理JSON数据:大数据分析的新方向,详解与示例

文章目录 1. MySQL中的JSON数据类型2. JSON函数和运算符3. 创建JSON列的表4. 插入JSON数据5. 查询JSON数据6. 复杂查询和聚合7. JSON 数据的索引8. 总结 在当今的大数据时代&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&a…...

【图形学】TA之路-矩阵

在 Unity 中&#xff0c;矩阵广泛用于处理各种图形变换&#xff0c;例如平移、旋转、缩放等。矩阵的使用不仅限于三维空间&#xff0c;还可以应用于二维空间的操作。了解矩阵及其运算对于游戏开发和计算机图形学非常重要。Unity 中使用的是行向量不是列向量&#xff0c;这个要注…...

LAMM: Label Alignment for Multi-Modal Prompt Learning

系列论文研读目录 文章目录 系列论文研读目录文章题目含义AbstractIntroductionRelated WorkVision Language ModelsPrompt Learning MethodologyPreliminaries of CLIPLabel AlignmentHierarchical Loss 分层损失Parameter Space 参数空间Feature Space 特征空间Logits Space …...

mac编译opencv 通用架构库的记录

1,通用架构 (x86_64;arm64&#xff09;要设置的配置项&#xff1a; CPU_BASELINE CPU_DISPATCH 上面这两个我设置成SSE_3&#xff0c;其他选项未尝试&#xff0c;比如不设置。 CMAKE_OSX_ARCHITECTURES:x86_64;arm64 WITH_IPP:不勾选 2,contrib库的添加&#xff1a; 第一次…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...