当前位置: 首页 > 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; 第一次…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...