Python学习之复习MySQL-Day8(事务)

目录

  • 文章声明⭐⭐⭐
  • 让我们开始今天的学习吧!
    • 事务简介
    • 事务操作
      • 模拟转账操作
      • 开启事务
      • 提交事务
      • 回滚事务
      • 查看/设置事务提交方法
      • 实例演示
    • 事务四大特性
    • 并发事务问题
      • 分类
    • 事务隔离级别
      • 分类
      • 查看/设置事务隔离级别
      • 实例演示


文章声明⭐⭐⭐

  1. 该文章为我(有编程语言基础,非编程小白)的 MySQL复习笔记
  2. 知识来源为 B站UP主(黑马程序员)的MySQL课程视频,归纳为自己的语言与理解记录于此并加以实践
  3. 此前我已经学习过了MySQL,现在是在复习阶段,所以不是面向小白的教学文章
  4. 不出意外的话,我大抵会 持续更新
  5. 想要了解前端开发(技术栈大致有:Vue2/3、微信小程序、uniapp、HarmonyOS、NodeJS、Typescript)与Python的小伙伴,可以关注我!谢谢大家!

让我们开始今天的学习吧!

事务简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作当成一个整体,一起向系统提交或撤销操作请求,这意味着这些操作要么同时成功,要么同时失败

最常见的例子就是转账操作

  • 要么成功转账:A的余额-1000并且B的余额+1000
  • 要么转账失败:A和B的余额都不变,和转帐前一致
  • 不允许出现:A已经转账了1000,但是由于网络问题或者系统问题,B没有收到1000转账,这就造成了数据库的数据错乱

MYSQL默认事务自动提交,也就是说,每当执行一条DML语句时,MYSQL会隐式地提交事务


事务操作

模拟转账操作

模拟Richie转账1000给Taylor(未出错,正常情况),操作示例如下:

mysql> select * from account where name = 'Richie'; # 首先查询Richhie账户余额是否足够1000
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  2000 |
+----+--------+-------+
1 row in set (0.00 sec)mysql> update account set money = money - 1000 where name = 'Richie'; # 将Richie账户余额-1000
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update account set money = money + 1000 where name = 'Taylor'; # 将Taylor账户余额+1000
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from account; # 可以看到数据没问题,转账成功
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  1000 |
|  2 | Taylor |  3000 |
+----+--------+-------+
2 rows in set (0.00 sec)

模拟Richie转账1000给Taylor(出错了),操作示例如下:

mysql> select * from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  2000 |
|  2 | Taylor |  2000 |
+----+--------+-------+
2 rows in set (0.00 sec)mysql> update account set money = money - 1000 where name = 'Richie'; # 将Richie账户余额-1000
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update account set money = money + 1000 where name = 'Taylor' # 这里我们模拟程序错误-> 模拟出错。。。;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '模拟出错。。。' at line 2mysql> select * from account; # 可以看到数据出现了错乱的现象,Taylor并未收到1000转账
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  1000 |
|  2 | Taylor |  2000 |
+----+--------+-------+
2 rows in set (0.00 sec)

开启事务

开启事务这个操作,只有在自动提交事务的情形下才能发挥作用

start transaction;
# 或者
begin;

提交事务

commit;

回滚事务

rollback;

查看/设置事务提交方法

mysql> # 查看事务提交方式
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.03 sec)mysql> # 关闭自动事务提交(0关闭,1开启)
mysql> set @@autocommit = 0;
Query OK, 0 rows affected (0.03 sec)mysql> # 开启自动事务提交(0关闭,1开启)
mysql> set @@autocommit = 1;
Query OK, 0 rows affected (0.00 sec)

实例演示

select 语句会自动提交一次事务!!!!!!

mysql> # 关闭自动提交事务
mysql> set @@autocommit = 0;
Query OK, 0 rows affected (0.00 sec)mysql> # 查看原始数据
mysql> select * from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  2000 |
|  2 | Taylor |  2000 |
+----+--------+-------+
2 rows in set (0.00 sec)mysql> # 更改数据
mysql> update account set money = money - 1000 where name = 'Richie';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update account set money = money + 1000 where name = 'Taylor';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> # 再查看数据,此时数据应该还是Richie2000,Taylor2000,只不过因为select语句会自动提交一次事务,所以变成了正常提交过事务后的数据,原表数据应该如下:
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  2000 |
|  2 | Taylor |  2000 |
+----+--------+-------+mysql> select * from account; # select语句自动提交了一次事务,数据变为如下:
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  1000 |
|  2 | Taylor |  3000 |
+----+--------+-------+
2 rows in set (0.00 sec)

模拟出现错误时,回滚事务:

mysql> select * from account; # 先查询原始数据
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  2000 |
|  2 | Taylor |  2000 |
+----+--------+-------+
2 rows in set (0.00 sec)mysql> update account set money = money - 1000 where name = 'Richie'; # Richie转账1000
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update account set money = money + 1000 where name = 'Taylor' # 模拟错误-> 模拟出现错误。。。;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '模拟出现错误。。。' at line 2
mysql> rollback; # 回滚事务,以至于上次提交事务之前的所有SQL语句都失效
Query OK, 0 rows affected (0.03 sec)mysql> select * from account; # 再次查询会发现,跟什么事都没发生一样
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | Richie |  2000 |
|  2 | Taylor |  2000 |
+----+--------+-------+
2 rows in set (0.00 sec)

事务四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使数据全部保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

并发事务问题

分类

问题描述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一个记录,但两次读取的数据不同,称之为不可重复读
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了一个幻影

事务隔离级别

分类

√:表示会出现这种情况
❌:表示不会出现这种情况

隔离级别脏读不可重复读幻读
read uncommitted
read committed(Oracle默认)
repeatable read(MySQL默认)
serializable(串行化)

事务隔离级别越高,数据越安全,但是性能就越低

查看/设置事务隔离级别

session指的是更改当前会话的事务隔离级别,global指的是更改全局的事务隔离级别

# 查看事务隔离级别
select @@transaction_isolation;
# 设置事务隔离级别,session指的是更改当前会话的事务隔离级别,global指的是更改全局的事务隔离级别
set [session | global] transaction isolation level {read uncommitted | read committed |repeatable read | serializable};

实例演示

这里因为验证的流程比较复杂,大家可以自行尝试验证

大家可以开启两个终端打开登录mysql,从而来模拟两个主机对数据库同时进行操作:
在这里插入图片描述

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

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

相关文章

TrustZone之顶层软件架构

在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们,欢迎来到福德植保无人机工厂的世界。这里,科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者,以其领先的无人机技术,创新的理念,为我们展示了一种全新的农业服…

【Filament】绘制矩形

1 前言 Filament环境搭建中介绍了 Filament 的 Windows 和 Android 环境搭,绘制三角形中介绍了绘制纯色和彩色三角形,本文将使用 Filament 绘制纯色和彩色矩形。 2 绘制矩形 本文项目结构如下,完整代码资源 → Filament绘制矩形。 2.1 自定义…

4.1 媒资管理模块 - Nacos与Gateway搭建

文章目录 媒资管理模块 - 媒资项目搭建一、需求分析1.1 介绍1.2 数据模型1.3 分析网关 二、 搭建Nacos2.1 服务发现中心2.2.1 Maven2.2.2 配置Nacos 2.2 配置中心2.2.1 介绍2.2.2 Maven 坐标2.2.3 配置 content-api 工程2.2.4 配置 content-service 工程2.2.5 配置 system-api …

玩转Docker(六):数据挂载与共享

文章目录 〇、Docker的两种存放数据的资源1.Storage Driver2.Data Volume3.使用场景 一、使用Data Volume1.-v <host_path>:<container_path>2.-v <container_path>挂载匿名卷 二、数据共享1.容器和主机之间共享2.容器之间共享(1)方法一&#xff1a;-v非匿名…

Zed的强大的调试宏

#为什么需要错误处理 大多数程序员假定错误不会发生&#xff0c;并且这一乐观的思想影响了他们所用和创造的语言。 C通过返回错误码或设置全局的errno值来解决这些问题&#xff0c;并且你需要检查这些值。 通过这种机制检查现存的复杂代码中&#xff0c;你所执行的东西是否发生…

JavaSE学习笔记 Day18

JavaSE学习笔记 Day18 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day1816.2.2迭代器16.2.3泛型的基本使用 16.3常见的单列集合实现类16.3.1ArrayList16.3.2List集合的遍历16.3.3ArrayList的底层实现16.3.4Linked…

Spark编程实验二:RDD编程初级实践

目录 一、目的与要求 二、实验内容 三、实验步骤 1、pyspark交互式编程 2、编写独立应用程序实现数据去重 3、编写独立应用程序实现求平均值问题 4、三个综合实例 四、结果分析与实验体会 一、目的与要求 1、熟悉Spark的RDD基本操作及键值对操作&#xff1b; 2、熟悉使…

Linux-----21、挂载

# 挂载命令 将硬件资源&#xff0c;或文件资源&#x1f4bf;&#xff0c;和&#x1f4c2;空目录&#x1f517;连接起来的过程 # mount linux 所有存储设备都必须挂载使用&#xff0c;包括硬盘 ​ 命令名称&#xff1a;mount ​ 命令所在路径&#xff1a;/bin/mount ​ 执行…

得帆信息创始人-张桐,受邀出席 BV百度风投AIGC主题论坛

近日&#xff0c;得帆信息创始人兼CEO张桐&#xff0c;作为百度风投被投代表企业创始人受邀出席“向未来&#xff0c;共成长” BV百度风投AIGC主题论坛。 与包括上海市徐汇区相关部门领导、百度集团相关事业部负责人及代表&#xff0c;以及来自国寿资本、中网投、麦顿投资的投资…

如何让32位.Net 应用打开3G开关

昨天刚分享了《如何让.NET应用使用更大的内存》&#xff0c;结果就有同学说&#xff0c;<最好加一下32位如何开启大内存&#xff0c;因为很多传统项目32位&#xff0c;实在迁移不动了>&#xff0c;那么&#xff0c;我就验证了一些可行的方案&#xff0c;发现都挺简单的。…

内网安全—Windows系统内核溢出漏洞提权

系统内核溢出漏洞提权 往缓冲区中写入超出限定长度的内容&#xff0c;造成缓冲区溢出&#xff0c;从而破坏程序的堆栈进而运行自己精心准备的指定代码&#xff0c;达到攻击的目的。 分类&#xff1a; 堆溢出 栈溢出 查找补丁的方法 1、手工查找补丁情况 systeminfo Wmic qfe…

CGAL和求解器

几个CGAL包必须解决稠密或稀疏矩阵的线性系统、线性整数规划和二次规划。这个包为此提供了概念和模型。 对于线性系统&#xff0c;我们通常使用Eigen库提供模型。 Eigen类Eigen_matrix和Eigen_vector的封装器也在需要时提供。为其他求解器开发等效模型很简单&#xff0c;例如在…

在Django中使用多语言(i18n)

在Django中使用多语言 配置中间件 MIDDLEWARE [......django.contrib.sessions.middleware.SessionMiddleware,django.middleware.locale.LocaleMiddleware, # 此行重点django.middleware.common.CommonMiddleware,...... ]配置翻译文件目录 根目录下创建目录locale # 国…

Cmake基础(5)

这篇文章主要描述如何使用cmake构建一个库工程 文章目录 add_libraryinstall 库工程的代码&#xff1a;头文件和源文件 #ifndef ADD_H #define ADD_H#ifdef _WIN32 #ifdef MYMATH_EXPORTS #define MYMATH_API __declspec(dllexport) #else #define MYMATH_API __declspec(dll…

CopyOnWriteArrayList(一)

1 CopyOnWriteArrayList介绍 CopyOnWriteArrayList是一个线程安全的ArrayList。 CopyOnWriteArrayList是基于lock锁和数组副本的形式去保证线程安全。 在写数据时&#xff0c;需要先获取lock锁&#xff0c;需要复制一个副本数组&#xff0c;将数据插入到副本数组中&#xff0c…

Semaphore学习一

一、定义 是JUC包下的一个工具类&#xff0c;我们可以通过其限制执行的线程数量&#xff0c;达到限流的效果。 当一个线程执行时先通过其方法进行获取许可操作&#xff0c;获取到许可的线程继续执行业务逻辑&#xff0c;当线程执行完成后进行释放许可操作&#xff0c;未获取达到…

Python 全栈体系【四阶】(七)

第四章 机器学习 六、多项式回归 1. 什么是多项式回归 线性回归适用于数据呈线性分布的回归问题。如果数据样本呈明显非线性分布&#xff0c;线性回归模型就不再适用&#xff08;下图左&#xff09;&#xff0c;而采用多项式回归可能更好&#xff08;下图右&#xff09;。例…

数据安全传输基础设施平台(二)

5安全传输平台总体设计 5.1 方案特点 规范化&#xff1a;严格遵循各种相关规范设计。独立性&#xff1a;系统各子系统间互相独立&#xff0c;在保持系统间接口的前提下&#xff0c;各系统间的升级互不干扰。最小耦合性&#xff1a;各子系统进行严格功能分解&#xff0c;每个子…

PCL点云处理之点云置平(拟合平面绕中心旋转到绝对水平)(二百二十七)

PCL点云处理之点云置平(绕中心旋转到绝对水平)(二百二十七) 一、什么是点云置平二、算法流程三、算法实现一、什么是点云置平 有时候,我们处理的点云平面并非位于水平面,而是位于某个任一三维平面上,而大多数算法又只能在水平面处理,或者水平面的点云处理是相对更简单…