mysql学习笔记(8)

news2024/9/20 5:31:42

一.事务

0.引入

        在mysql中,事务是一个最小的不可分割的单元,事务能保障一个业务的完整性。

例如银行转账:

a ----> -100

update user set money = money = money - 100 where name = 'a';

b ----> +100

update user set money = money = money + 100 where name = 'b';

实际程序中,如果只有一条程序执行成功,而另一条没有成功,出现数据不一致。

update user set money = money = money - 100 where name = 'a';
update user set money = money = money + 100 where name = 'b';

多条sql程序,有同事执行成功的需求。要么就同时失败。

mysql中如何控制事务?

1.mysql是默认开启事务的(自动提交)。

select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+

默认事务开启的作用是什么?

当我们去执行一个说起来语句时,效果会立即体现出来,且不能回滚。

create database bank;
use bank;
create table user(
    id int primary key,
    name varchar(20),
    money int
);
insert into user value(1,'张三',2000);
mysql> select * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
+----+------+-------+

回滚(rollback):撤销sql语句执行效果;

rollback;
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
+----+------+-------+
1 row in set (0.00 sec)

那么该如何撤销呢?

设置mysql自动提交为FALSE:

set autocommit = 0;

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

select @@autocommit;

+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

上面的操作关闭了mysql的自动提交(commit);

测试一下:

mysql> insert into user value(2,'李四',6000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+------+-------+  ##这是虚拟的表,真是的表没有提交
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  6000 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user;
+----+------+-------+##真是的表还未提交。
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
+----+------+-------+
1 row in set (0.00 sec)

 如何让他真是的插入数据呢?

##再一次插入数据
mysql> insert into user value(2,'李四',6000); 
Query OK, 1 row affected (0.00 sec)
##手动插入数据
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
##无法撤销
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  6000 |
+----+------+-------+
2 rows in set (0.00 sec)
小结

        自动提交;@@autocommmit = 1

        手动提交;commit;

        事务回滚;rollback;

如果说这时候转账,

update user set money = money - 100 where name = '张三';
update user set money = money + 100 where name = '李四';
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  6000 |
+----+------+-------+
2 rows in set (0.00 sec)

2.手动开启事务

set autocommit = 1;

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

除了上述方法之外,begin; 或者 start transaction;都可以手动开启一个事务。

mysql> select *from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  6000 |
+----+------+-------+
mysql> update user set money = money - 100 where name = '张三';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update user set money = money + 100 where name = '李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql>  select * from user;
+----+------+-------+## rollback是没有效果的
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)
 手动开启事务(1)
mysql> begin ;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set money = money - 100 where name = '张三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update user set money = money + 100 where name = '李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1800 |
|  2 | 李四 |  6200 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user;
+----+------+-------+##成功回滚了
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)
手动开启事务(2)
mysql> start transaction;

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> update user set money = money - 100 where name = '张三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update user set money = money + 100 where name = '李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1800 |
|  2 | 李四 |  6200 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)

事务开启之后,一旦commit调,就不能回滚。

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql>  select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1900 |
|  2 | 李四 |  6100 |
+----+------+-------+
2 rows in set (0.00 sec)

3.事物的特征

A.原子性:事务是最小的单位,不可分割;

C.一致性:事务要求,同一事物中的sql语句,必须保证同时成功或同时失败;

I . 隔离性:事务a和事务b之间是有隔离性的;

D.持久性:事务一旦结束(commit; rollback),就不可能返回。

4.事物的开启

        ①事务默认提交: set autocommit = 0;

        ②begin;

        ③start transection;

5.事务手动提交

        commit;

6.事务手动回滚

        rollback;

7.事物的隔离性

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

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

相关文章

【macOS】【zsh报错】zsh: command not found: python

【macOS】【zsh Error】zsh: command not found: python 本地已经安装了Python,且能在Pycharm中编译Python程序并运行。 但是,在macOS终端,运行Python,报错。 首先要确认你在macOS系统下,是否安装了Python。 如果安…

打不开Qtcreator(This application fail to start...........)

目录 今天突然打不开Qtcreator,报错如下 解决方案 1.检查环境变量配置(我就是通过这个解决好的) 2.如果也弹出跟我一样的AMD窗口,可以更新AMD驱动试试 3.重装qtcreator 4.检查 qtcreator下的bin\plugins\platforms是否缺少提示的相关.dll文件 总结 今天突然打不开Qtcreat…

马来西亚交通标志检测系统源码分享

马来西亚交通标志检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

VSCode语法提示的配置

ctrlshiftP打开Command Palette,运行C/Cpp: Edit configurations...生成c_cpp_properties.json c_cpp_properties.json是什么? 这个文件主要是用于VSCode语法提示的配置,例如:指定 include 路径,问题匹配类型等。CtrlShiftP打开C…

nvm list available报错Could not retrieve https://nodejs.org/dist/index.json.

今天在查看nvm list available时出现如下错误: 首先找到nvm所在文件夹settings.txt 打开此文件后,加入两段代码,如果有就替换掉 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/ 再次运行…

Android轻量级RTSP服务使用场景分析和设计探讨

技术背景 好多开发者,对我们Android平台轻量级RTSP服务模块有些陌生,不知道这个模块具体适用于怎样的场景,有什么优缺点,实际上,我们的Android平台轻量级RTSP服务模块更适用于内网环境下、对并发要求不高的场景&#…

golang操作mysql利器-gorm

1、傻瓜示例 GORM通过将数据库表中的数据映射到面向对象的模型中,简化了数据库操作,使得开发者可以很方便的使用代码来操作数据库,而无需编写SQL语句。 目前有个mysql表:miniprogram_orders,其存储了所有用户对应的订…

PyCharm和VS Code 安装通义灵码,可本地安装包安装,解决插件安装不上问题

PyCharm和VS Code 安装通义灵码,可本地安装包安装,解决插件安装不上问题 PyCharm、VS Code 安装通义灵码介绍主要应用场景支持编程语言安装指南JetBrains IDEs 中安装指南步骤 1:准备工作步骤 2:在 JetBrains IDEs 中安装通义灵码…

实验3 Hadoop集群运行环境搭建和使用

实验3 Hadoop集群运行环境搭建和使用 一、实验介绍 本节实验旨在引导学生通过实际操作搭建一个基本的Hadoop集群,并进行基本的使用验证。实验包括在集群节点上添加域名映射以实现节点间的相互识别,配置免密SSH登录以便无密码访问各节点,安装和配置JDK以满足Hadoop的运行需求…

Flink1.18.1 Standalone模式集群搭建

Flink1.18.1 Standalone模式集群搭建 Flink1.18.1 Standalone模式集群搭建1. 环境准备1.1 Flink下载地址1.2 集群角色分配 2. Flink 集群安装步骤2.1 下载并解压 Flink2.2 解压安装包2.3 配置环境变量2.4 配置 SSH 免密登录 3. 配置 Flink 集群3.1 修改 flink-conf.yaml 配置文…

jmeter得到的文档数据处理

通过前面jmeter得到的输出文档,这里是txt文档,里面包含了很多条数据,每条数据的结构如下: 【request】 uuid:xxxxxxx timestamp:xxxxxxxx No.x question:xxxxxxx 【response】 code&#…

DMA学习

一、DMA简介 DMA是一种无需CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。 DMA方式的数据传输由DMA控制器(DMAC)控制,在传…

sensitive-word 敏感词 v0.20.0 数字全部匹配,而不是部分匹配

敏感词系列 sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word-admin v1.3.0 发布 如何支持分布式部署? 01-开源敏感词工具入门使用 02-如何实现一个敏感词工具?违禁词实现思路梳理 03-敏感词之 StopWord 停止词优化与特殊符号 04-…

AAAI2024--频谱在多模态表示和融合中的作用更为有效:A Multimodal Spectrum Rumor Detector

https://github.com/dm4m/FSRU 多模态内容,如将文本与图像混合,对社交媒体中的谣言检测提出了重大挑战。现有的多模态谣言检测侧重于在空间和序列位置之间混合令牌进行单模态表示,或者在模态间融合谣言真实性的线索。然而,它们受…

将本地离线Jar包上传到Maven远程私库上,供项目编译使用

背景 因项目对接需求,需对接第三方Jar(海康人脸识别服务网关API),在项目集成时,处于本地编译、远程持续构建的需要将离线Jar推送到远程Maven仓库。 实施步骤 进入到离线Jar包同文件夹下 配置Maven配置文件中远程账户信息 需要在Idea配置的…

Java 数据类型转换详解:隐式转换(自动转换)与强制转换(手动转换)

目录 前言 取值范围从小到大的关系: 隐式转换(自动转换) 📜示例 1:基本类型隐式转换 📜示例 2:算术运算中的类型提升 📜示例 3:byte、short 和 char 的自动转换 隐…

Hive基本原理与数据开发

目录 1.什么是Hive 2.Hive的特点和优势 2.1.Hive的特点 2.1.1.易用性 2.1.2.高效性 2.1.3.兼容性 2.1.4.可扩展性 2.1.5.容错性 2.2.与传统数据库的区别 3.hive的架构 3.1.hive的核心组件(如 Metastore、Driver、Query Compiler、Execution Engine 等) 3.1.1.用户接…

Apache的ab压力测试工具与性能监控

【图书介绍】《软件性能测试、分析与调优实践之路(第2版)》_软件性能测试分析与调优实践之路-CSDN博客《软件性能测试、分析与调优实践之路(第2版)》(张永清)【摘要 书评 试读】- 京东图书 (jd.com) Apache的ab压力测试工具 A…

go语言中的切片详解

1.概念 在Go语言中,切片(Slice)是一种基于数组的更高级的数据结构,它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用,因为它们可以动态地增长和缩小,这使得它们比固定大小的数组更加灵活。…

电子看板实时监控数据可视化助力工厂精细化管理

在当今竞争激烈的制造业领域,工厂的精细化管理成为提高竞争力的关键。而电子看板实时监控数据可视化作为一种先进的管理工具,正为工厂的精细化管理带来巨大的助力。 一、工厂精细化管理的挑战 随着市场需求的不断变化和客户对产品质量要求的日益提高&am…