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

前言

大家好吖,欢迎来到 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.hqwc.cn/news/587924.html

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

相关文章

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具,火狐浏览器的Firebug插件调试工具,IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速,功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…

Taro多行文本最多展示5行,超出“查看更多”展示,点击弹层

Taro中,页面需求: 多行文本,展示最多展示5行,超出5行,展示“查看更多”按钮,点击弹层展示文本详细信息。 弹层代码就不说了,着重说一下怎么获取区域高度~ 1.区域设置max-height&am…

redis的键值基本操作

设置数据 首先设置键值对 删除age,会得到nil,表示这个键已经被删除掉了 判断age键还在不在 查找所有键 查找所有以me结尾的键 删除所有键 redis的键和值都是二进制存储的,所以默认不支持中文。 但是,我们重新登录客户端&#xff…

MySQL-linux安装-万能RPM法

一、MySQL的Linux版安装 1、 CentOS7下检查MySQL依赖 1. 检查/tmp临时目录权限(必不可少) 由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限。执行 : chmod -R 777 /tmp2. …

为什么mac文件拖拽不了 mac文件拖不进硬盘里 macbookpro文件无法拖进移动硬盘 Tuxera NTFS for Mac 2023绿色

如果你是一位Mac用户,你可能会遇到这样的问题:你想把Mac上的文件拖拽到其他位置,比如桌面、文件夹或者外接硬盘,但是却发现无法操作,这是为什么呢?这篇文章将为你解答为什么mac文件拖拽不了,以及…

非关系型数据库-----------探索 Redis高可用 与持久化

目录 一、Redis 高可用 1.1什么是高可用 1.2Redis的高可用技术 二、 Redis 持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三、Redis 持久化之----------RDB 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.2执行流程 3.3启动时加载…

增强Java技能:使用OkHttp下载www.dianping.com信息

在这篇技术文章中,我们将探讨如何使用Java和OkHttp库来下载并解析www.dianping.com上的商家信息。我们的目标是获取商家名称、价格、评分和评论,并将这些数据存储到CSV文件中。此外,我们将使用爬虫代理来绕过任何潜在的IP限制,并实…

Linux编译器 --- gcc/g++使用

文章目录 gcc/g使用1.背景知识2.gcc如何完成2.1 预处理(进行宏替换)2.2 编译(生成汇编)2.3 汇编(生成机器可识别代码)2.4 连接(生成可执行文件或库文件)2.5 gcc选项 gcc/g使用 1.背景知识 预处理&#xf…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期,需要搭建项目基本框架,为此离不开辅助工具,即脚手架。当然,IDE也可以实现新建空白项目,但是其新建后的项目结构可能不符合预期设计&#xff0…

建立统一网络身份认证平台,赋能用户信息安全

“近年来,层出不穷的网络谣言、网络暴力事件以及网络水军、网络黑灰产犯罪屡禁不止、屡打不绝,其主要原因是网络实名制落实不到位。”全国人大代表、黑龙江省大庆市公安局网络警察分局副局长贾晓亮接受记者采访时表示,网络信息安全问题是我们…

GD32F470_EC11旋转编码器模块移植

2.2 EC11旋转编码器 旋转编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。读数系统通常采用差分方式,即将两个波形一样但相位差为180的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是在两个信号的差…

FPGA常用IP核之FIFO学习

IP核是FPGA芯片公司提供的逻辑功能块,在FPGA芯片中可以进行优化和预先配置,可以直接在用户设计的程序中使用,应用范围很广。在FPGA设计开发过程中使用IP核,可以大大的缩短开发周期,高度优化的IP核可以使FPG开发工程师专…