【Mysql】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】

news2024/11/24 10:29:41

前言

大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C++ Linux的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 基本内容总览
  • 一.事务简介
  • 二.事务操作(模拟转账失败)
    • 1.事务操作系列语法1-【查看/设置事务提交方式--提交事务--回滚事务】
    • 2.事务操作系列语法2-【开启事务--提交事务--回滚事务】
    • ※数据准备环节
    • 3.模拟转账失败-(方式一:修改事务提交方式为手动)
    • 4.模拟转账失败-(方式二:不修改事务提交方式,自动)
  • 三.事务四大特性(A-C-I-D)
  • 四.并发事务问题(脏读-幻读-不可重复读)
    • 基本概念一览
    • 1.脏读
    • 2.不可重复读
    • 3.幻读
  • 五.事务隔离级别
    • 1.事务隔离级别&要点
    • 2.查看/修改事务隔离级别语法
    • 3.用两个Mysql客户端模拟并发事务,并测试各个隔离级别效果
      • ※事务回顾隔离级别
      • 1.模拟脏读
      • 2.修改隔离级别——[避免脏读--->不可重复读]
      • 3.修改隔离级别——[避免不可重复读--->幻读]
      • 4.修改隔离级别——[避免幻读--->进入阻塞状态]

基本内容总览

  • 详细内容查看下文
    在这里插入图片描述

一.事务简介

  • 核心理念: 把一系列操作当作一个整体
    在这里插入图片描述

二.事务操作(模拟转账失败)

1.事务操作系列语法1-【查看/设置事务提交方式–提交事务–回滚事务】

  • 自动:@@autocommit=1
  • 手动:@@autocommit=0
    在这里插入图片描述
--查看事务提交方式
SELECT @@autocommit ;//会显示 @@autocommit=1;默认为自动

--设置事务提交方式
SET @@autocommit=0;//手动

--提交事务
COMMIT;

--回滚事务
ROLLBACK ;

2.事务操作系列语法2-【开启事务–提交事务–回滚事务】

  • 总览如下
    在这里插入图片描述
--开启事务
START TRANSACTION 或 BEGIN;

--提交事务
COMMIT ;

--回滚事务
ROLLBACK;

※数据准备环节

-- 数据准备
create table account(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    money int comment '余额'
) comment '账户表';
insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);


-- 恢复数据操作
update account set money = 2000 where name = '张三' or name = '李四';

3.模拟转账失败-(方式一:修改事务提交方式为手动)

  • 我们这个实验要用到上面的系列语法1
--查看事务提交方式
SELECT @@autocommit ;//会显示 @@autocommit=1;默认为自动

--设置事务提交方式
SET @@autocommit=0;//手动

--提交事务
COMMIT;

--回滚事务
ROLLBACK ;
  • 如下方代码所示,我们用程序执行报错 ...模拟抛异常
  • 此时由于我们 设置为手动提交 set @@autocommit = 0; 所以事务并未提交;
  • 后续rollback ; 回滚事务即可;
    在这里插入图片描述
-- 方式一
select @@autocommit;

set @@autocommit = 0; -- 设置为手动提交

-- 转账操作 (张三给李四转账1000)
-- 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 = '李四';

-- 提交事务
commit;

-- 回滚事务
rollback ;

4.模拟转账失败-(方式二:不修改事务提交方式,自动)

  • 我们这个实验要用到上面的系列语法2
--开启事务
START TRANSACTION 或 BEGIN;

--提交事务
COMMIT ;

--回滚事务
ROLLBACK;
  • 开始操作前记得 改回自动提交 set @@autocommit = 1; -- 改回自动提交
  • 如下方代码所示,我们用程序执行报错 ...模拟抛异常
  • 此时由于我们 开启了事务 start transaction ; 所以事务报错后并未提交;
  • 后续rollback ; 回滚事务即可;
    在这里插入图片描述
-- 方式二
-- 改回自动提交
set @@autocommit = 1; 

-- 转账操作 (张三给李四转账1000)
start transaction ;

-- 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 = '李四';


-- 提交事务
commit;

-- 回滚事务
rollback;

三.事务四大特性(A-C-I-D)

  • 如下图所示
    在这里插入图片描述

四.并发事务问题(脏读-幻读-不可重复读)

基本概念一览

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

1.脏读

  • 脏读:一个事务 读到 另外一个事务还 没有提交的数据。
  • 如下图所示:
    在这里插入图片描述

2.不可重复读

  • 不可重复读:一个事务 先后读取同一条记录,但两次读取的 数据不同,称之为不可重复读。
  • PS:不可重复读是解决脏读导致的
  • 如下图所示:
    在这里插入图片描述

3.幻读

  • 幻读:一个事务按照条件 查询数据时 没有对应的数据行,但是在 插入数据时,又发现这行数据 已经存在,好像出现了幻影”。
  • PS:幻读是解决不可重复读导致的
  • 如下图所示:
    在这里插入图片描述

五.事务隔离级别

1.事务隔离级别&要点

  • 要点:事务隔离级别越高,数据越 安全 ,但是 性能 越低。
  • 事务隔离级别,如下所示:
    在这里插入图片描述

2.查看/修改事务隔离级别语法

  • 如下图所示
    在这里插入图片描述
  • 下图:修改隔离级别后查看在这里插入图片描述
--查看事务隔离级别语法
SELECT @@TRANSACTION_ISOLATION;

--修改事务隔离级别语法
SET [SESSION|GLOBLE] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

3.用两个Mysql客户端模拟并发事务,并测试各个隔离级别效果

※事务回顾隔离级别

  • 事务隔离级别,如下所示:
    在这里插入图片描述

1.模拟脏读

  • 脏读:一个事务 读到 另外一个事务还 没有提交的数据。
    在这里插入图片描述
    在这里插入图片描述

2.修改隔离级别——[避免脏读—>不可重复读]

  • 不可重复读:一个事务 先后读取同一条记录,但两次读取的 数据不同,称之为不可重复读。
  • PS:不可重复读是解决脏读导致的
    在这里插入图片描述
  • 现象: 同样sql在同一语句查询中不一致
    在这里插入图片描述

3.修改隔离级别——[避免不可重复读—>幻读]

  • 幻读:一个事务按照条件 查询数据时 没有对应的数据行,但是在 插入数据时,又发现这行数据 已经存在,好像出现了幻影”。
  • PS:幻读是解决不可重复读导致的
  • 注意:我们这次实验不用修改隔离级别,因为是默认的(如果已经修改了同上面改回来即可)
    在这里插入图片描述
  • 现象如图所示:
    在这里插入图片描述

4.修改隔离级别——[避免幻读—>进入阻塞状态]

  • 阻塞状态:在阻塞状态下,进程或线程可能会被挂起,直到条件满足或事件发生后才能被唤醒并继续执行。
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)

目录 前言 基本使用教程 新建远程连接 连接主机 自定义命令 路由追踪 前言 后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器&am…

Spring Boot接收从前端传过来的数据常用方式以及处理的技巧

一、params 传参 参数是会拼接到url后面的请求 场景规范:url后面的key值<=3个参数的时候,使用params 传参 支持的请求方式:get(正规的是get方式)、post 都行 例如: http://localhost:8080/simpleParam?name=Tom&age=10 在postman里面的体现为 后端接收的接口…

AKF扩展立方体和AKF可用性立方体

很多人知道AKF扩展立方体是从《架构即未来》这本书开始。实际上akfpartners官方写过4篇关于AKF扩展立方体的文章&#xff0c;还有一篇介绍AKF可用性立方体。akfpartners官方在高可用、扩展性方面有很多专业技术文章&#xff0c;建议有空就翻翻看。 AKF扩展立方体和AKF可用性立方…

AAC相关知识

一、AAC音频格式种类有哪些 AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种封装格式 ADIF&#xff08;Audio Data Interchange Format音频数据交换格式&#xff09;和ADTS&#xff08;Audio Data transport Stream音频数据传输流&#xff09;。 ADIF 特点…

最简单的 AAC 音频码流解析程序

最简单的 AAC 音频码流解析程序 最简单的 AAC 音频码流解析程序原理源程序运行结果下载链接参考 最简单的 AAC 音频码流解析程序 参考雷霄骅博士的文章&#xff1a;视音频数据处理入门&#xff1a;AAC音频码流解析 本文中的程序是一个AAC码流解析程序。该程序可以从AAC码流中…

Lafida多目数据集实测

Lafida 数据集 paper&#xff1a;J. Imaging | Free Full-Text | LaFiDa—A Laserscanner Multi-Fisheye Camera Dataset 官网数据&#xff1a;https://www.ipf.kit.edu/english/projekt_cv_szenen.php 官网&#xff1a;KIT-IPF-Software and Datasets - LaFiDa 标定数据下载&…

解析Flutter应用在iOS环境中的性能优化技巧

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

Javascript/Node.JS中如何用多种方式避免属性为空(cannot read property of undefined ERROR)

>>>>>>问题 "cannot read property of undefined" 是一个常见的 JavaScript 错误&#xff0c;包含我在内很多人都会遇到&#xff0c;表示你试图访问一个未定义&#xff08;undefined&#xff09;对象的属性。这通常是因为你在访问一个不存在的对象…

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…

MySQL之索引详细总结

索引简介 索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据结构上实现高级查法&#xff0c;这种数据结构就是索引 为什…

Java零基础入门-java8新特性(中篇)

一、概述 ​上几期&#xff0c;我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念&#xff0c;而这一期&#xff0c;我们要来玩点好的东西&#xff0c;那就是java8&#xff0c;我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新&…

电商技术揭秘五:电商平台的个性化营销与数据分析

文章目录 引言1. 个性化营销的概念与价值1.1 个性化营销的定义1.1.1 个性化营销的基本概念1.1.2 个性化营销在电商领域的重要性 1.2 个性化营销的核心价值1.2.1 提升用户体验1.2.2 增加转化率和客户忠诚度1.2.3 优化营销资源配置 2. 用户画像与行为分析2.1 用户画像的构建2.1.1…

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程&#xff0c;算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库&#xff0c;Kafka存业务数据&#xff0c;MySQL存维度数据 采集工具是Kettle和Flume&#xff0c;Flume采集Kafka数据&#xff0c;Kettle采集MySQL数据 离线数仓是Hi…

Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

Topaz Video AI for Mac是一款功能强大的视频处理软件&#xff0c;专为Mac用户设计&#xff0c;旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术&#xff0c;能够自动识别和分析视频中的各个元素&#xff0c;并进行智能修复和增强&…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

docker容器环境安装记录(MAC M1)(完善中)

0、背景 在MAC M1中搭建商城项目环境时&#xff0c;采用docker统一管理开发工具&#xff0c;期间碰到了许多环境安装问题&#xff0c;做个总结。 1、安装redis 在宿主机新建redis.conf文件运行创建容器命令&#xff0c;进行容器创建、端口映射、文件挂载、以指定配置文件启动…

《QT实用小工具·八》数据库通用翻页类

1、概述 源码放在文章末尾 该项目实现数据库通用翻页类&#xff0c;主要包含如下功能&#xff1a; 1:自动按照设定的每页多少行数据分页 2:只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签 3:提供公共静态方法绑定字段数据到下拉框 4:建议条件字段用数字类型的主…

37.HarmonyOS鸿蒙系统 App(ArkUI) 创建第一个应用程序hello world

HarmonyOS App(ArkUI) 创建第一个应用程序helloworld 线性布局 1.鸿蒙应用程序开发app_hap开发环境搭建 3.DevEco Studio安装鸿蒙手机app本地模拟器 打开DevEco Studio,点击文件-》新建 双击打开index.ets 复制如下代码&#xff1a; import FaultLogger from ohos.faultL…

SpringBoot+ECharts+Html 字符云/词云案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_comment表&#xff0c;表中设置两个字段word与count&#xff0c;添加表中的数据。如&#xff1a;附件中的 echartsdb.sql 3. SpringBoot…

将excel数据拆分成多个excel文件

一、背景&#xff1a; 平时在日常工作中&#xff0c;经常需要将excel的文件数据进行拆分&#xff0c;拆分成多个excel文件&#xff0c;然而用人工来处理这个既耗时&#xff0c;又费精力&#xff0c;眼睛会疲劳&#xff0c;时间长了操作上会出现失误&#xff0c;导致数据拆分错…