【示例】MySQL-事务控制示例:账户转账-savepoint关键字

前言

本文讲述MySQL中的事务,以账户转账为例,体会事务的概念,并讲解事务相关的一个关键字用法:savepoint

示例

数据准备

drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment 'ID',name varchar(10) comment '姓名',money double(10,2) comment '余额'
) comment '账户表';insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

未控制事务 | 转账正常

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

所有SQL正常执行,没有出错。结果就是:张三账户余额-1000;李四账户余额+1000

未控制事务 | 异常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';-- 手动写一行错误的SQL语句
select xxx xxx;-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

只有前两个SQL执行了,第三个SQL没有执行,出现数据不一致了:张三的钱减少了,但是李四的钱没有增加

控制事务 | 示例

mysql> START TRANSACTION;													# 开启事务
Query OK, 0 rows affected (0.00 sec)mysql> select * from account where name = '张三';		  					   # 展示张三账户金额
+----+--------+---------+
| id | name   | money   |
+----+--------+---------+
|  1 | 张三   | 2000.00 |
+----+--------+---------+
1 row in set (0.00 sec)mysql> update account set money = money - 1000 where name = '张三';			# 将张三账户金额减少1000
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update account set money = money + 1000 where name = '李四';			# 将李四账户金额增加1000
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from account where name = '张三';				# 查询张三账户金额(在事务里看,金额确实少了。但是数据库里面账户值还没变)
+----+--------+---------+
| id | name   | money   |
+----+--------+---------+
|  1 | 张三   | 1000.00 |
+----+--------+---------+
1 row in set (0.00 sec)mysql> COMMIT;									# 上述操作均成功,提交事务,修改生效。若某一操作失败,需要回滚,COMMIT改为ROLLBACK
Query OK, 0 rows affected (0.00 sec)mysql> select * from account where name = '张三';
+----+--------+---------+
| id | name   | money   |
+----+--------+---------+
|  1 | 张三   | 1000.00 |
+----+--------+---------+
1 row in set (0.00 sec)

上述操作过程大致三个步骤:开启事务、执行一组SQL语句、提交或回滚事务。

事务开启方式

针对开启事务这一步,有如下几种方式:

# 方式1:关闭隐式事务
SELECT @@autocommit;
SET @@autocommit = 0;# 方式2:手动开启事务
START TRANSACTION;# 方式3:手动开启事务-另一种
BEGIN;

针对提交或回滚事务这一步,是看上数SQL操作是否都成功。若都成功,则提交;若有失败,则回滚,使数据恢复到修改前的状态:

COMMIT;   # 若SQL语句执行正常,提交事务ROLLBACK; # 若SQL语句有执行异常,回滚事务

若是要用一个sql脚本来处理一组事务,则应该在提交或者回滚这一步加上判断条件:

# 开始事务
BEGIN;#执行一组SQL
xxxxxx# 提交或回滚
if(所有SQL执行成功) THENCOMMIT;
ELSEROLLBACK;
END IF;

复杂的事务处理过程,通常可以借助第三方工具,例如脚本语言:Python、PHP等。

事务相关关键字 | savepoint

savepoint关键字可以使得回滚事务的时候只混滚部分代码处理的结果。

如下,是关于savepoint的大概作用流程:

# 开启事务
xxx# 一组SQL
xxx修改操作1
xxx修改操作2
SAVEPOINT change1;
xxx查询操作1
xxx查询操作2,出问题报错了# 因为修改操作都完成了,在查询结果是否正确的时候出了错误,就可以通过这样,只回滚change1到ROLLBACK TO change1之间的代码
ROLLBACK TO change1;# ROLLBACK如果不加TO,就会回滚到初始位置,不管是否有savepoint
# 若是不想要某个savepoint点,可以删除
RELEASE SAVEPOINT change1;

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

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

相关文章

metrology

* draw_line (3600, Row11, Column11, Row21, Column21) Row11:1168.63385826772 Column11:934.322404371585 Row12:1280.58267716535 Column12:1233.27322404372 * draw_rectangle2 (3600, Row8, Column8, Phi1, Length11, Length21) *画矩形区域 Row3:1102.91534391534 Colum…

在Windows下面的vscode配置cmake使用vcpkg包管理器

安装 vscode下载地址 cmake下载地址 vcpkg下载地址 创建CMake项目 // main.cpp #include <fmt/core.h>int main() {fmt::print("Hello World!\n");return 0; }// CMakeLists.txtcmake_minimum_required(VERSION 3.10)project(HelloWorld)find_package(fmt…

没有公网IP怎么办?

在网络通信中&#xff0c;公网IP是指可以直接访问互联网的IP地址。由于各种原因&#xff0c;有一些用户可能没有自己的公网IP地址。那么没有公网IP的情况下&#xff0c;我们应该怎么办呢&#xff1f; 局域网的限制 我们需要了解局域网的概念。局域网是指在一个相对较小的范围内…

LAMMPS如何识别多孔结构的孔隙及其大小

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material

redis 数据迁移到rds2214(TongRDS-2.2.1.3.Load版 by lqw)

​ 文章目录 一.备份redis文件 vi redis.conf &#xff0c;看看有没有这两行设置&#xff0c;有的话改成跟下面的一致&#xff1a; appendonly yes appendfilename “appendonly.aof” 之后连接redis客户端&#xff0c;输入INFO persistence&#xff0c;如图所示即为开启成功…

生产环境一些十分有用的JVM参数

-Xms{x}m &#xff1a;初始化堆内存大小 -Xmx{x}m : 最大堆内存大小 一般将Xms Xmx 这两个参数值设为相同值&#xff0c;防止反复GC、导致内存抖动。 -Xloggc:{path}_%p_%t.log: GC日志文件&#xff0c;这对垃圾回收器的调整和内存问题诊断有重要作用。其中%p表示进程号占位符…

【C++学习】C++智能指针:提高代码安全与性能的利器

文章标题 智能指针的提出智能指针概念及使用RAII 智能指针的原理C库多种智能指针详解版本一&#xff1a;std::auto_ptr&#xff08;C98&#xff09;1. std::auto_ptr 使用2. std::auto_ptr 原理3. std::auto_ptr 模拟实现 版本二&#xff1a;unique_ptr (C11)1. unique_ptr 的使…

算法—分治

分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时&#xff0c;采用这种思想&#xff0c;基本问题指问题规模最小时的情况&#xff0c;次级问题是指主问题的n级降低n-1级的问题。 具体实现&#xff1a;多数采用递归操作分解&#xff0c;然后递归操作&#…

【Linux】编写一个 shell 脚本执行

在Linux中编写和执行脚本相对简单。下面是一个基本的步骤指南&#xff0c;帮助你创建一个简单的bash脚本并运行它&#xff1a; 1. 创建脚本文件 首先&#xff0c;你需要使用文本编辑器创建一个新的文件。这个文件通常会有 .sh 的扩展名&#xff0c;以表明它是一个shell脚本。…

Android 纵向双选日历

这个日历的布局分两部分&#xff0c;一部分是显示星期几的LinearLayout&#xff0c;另外就是一个RecyclerView&#xff0c;负责纵向滚动了。 工具类&#xff1a; implementation com.blankj:utilcode:1.17.3上activity_calendar代码&#xff1a; <?xml version"1.0&…

研究了一款Vue2开发的Markdown编辑器

最近突然喜欢开始写作了&#xff0c;写笔记&#xff0c;写日记&#xff0c;写总结&#xff0c;各种写。所以&#xff0c;想要打造一个自己喜欢的编辑器&#xff0c;于是开始研究。 首先来看看我从Github丄扒拉到的这个开源的代码&#xff1a; 运行起来以后效果是这样的&…

探究C++20协程(1)——C++协程概览

什么是协程&#xff1f; 协程就是一段可以挂起&#xff08;suspend&#xff09;和恢复&#xff08;resume&#xff09;的程序&#xff0c;一般而言&#xff0c;就是一个支持挂起和恢复的函数。 一般情况下&#xff0c;函数一旦开始&#xff0c;就无法暂停。如果一个函数能够暂…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

走进MySQL:从认识到入门(针对初学者)

一&#xff0c;引言 MySQL是一款久负盛名且广泛应用的关系型数据库管理系统&#xff0c;自1995年Michael Widenius和David Axmark在瑞典和芬兰发起研发以来&#xff0c;其发展历程可谓辉煌且深远。作为开源软件的代表&#xff0c;MySQL以其卓越的成本效益、高性能及高可靠性赢得…

关于 Amazon DynamoDB 的学习和使用

文章主要针对于博主自己的技术栈&#xff0c;从Unity的角度出发&#xff0c;对于 DynamoDB 的使用。 绿色通道&#xff1a; WS SDK for .NET Version 3 API Reference - AmazonDynamoDBClient Amazon DynamoDB Amazon DynamoDB is a fast, highly scalable, highly available,…

Harmony鸿蒙南向驱动开发-RTC接口使用

功能简介 RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时…

【Java SE】11.认识异常

目录 1.异常的概念与体系结构 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 2.异常的处理 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.3.1异常声明throws 2.3.2try-catch捕获并处理 2.3.3finally 2.4异常的处理流程 3.自定义异常类 1.异常的概念与体系结构 …

MAC OS关闭SIP(navicat 无法保存密码)

最近安装navicat&#xff08;16.3.7&#xff09;时,安装后无法保存密码,保存密码会报错如下&#xff1a; 因为用的破解版&#xff0c;一开始是打不开的&#xff0c;用自带的修复软件修复后就可以打开了&#xff0c;但是保存密码就会报错&#xff0c;按照网上的一些操作 1、卸载…

蓝桥杯嵌入式(G431)备赛笔记——RTC

// RTC time// 声明一个变量 rtc_tick 用于记录上次 RTC 处理的时间 u32 rtc_tick 0;// 声明结构体变量 D 用于存储 RTC 的日期信息 RTC_DateTypeDef D;// 声明结构体变量 T 用于存储 RTC 的时间信息 RTC_TimeTypeDef T;// RTC_proc 函数&#xff0c;用于处理 RTC 时间 void R…

Github 2024-04-10 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Shell项目1Python项目1Git - 快速、可扩展、分布式的版本控制系统 创建周期:5740 天开发语言:C, Shell协议类型:OtherStar数量:4955…