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

news/发布时间2024/7/26 22:51:10

前言

大家好吖,欢迎来到 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.shwantai.cn/a/73288703.html

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

相关文章

CUDA编程:矩阵乘运算从CPU到GPU

CUDA编程:矩阵乘运算从CPU到GPU 本文内容涉及到CUDA矩阵1D运算、2D运算、共享内存、CUBLAS的使用。 文中的全部code: https://github.com/CalvinXKY/BasicCUDA/tree/master/matrix_multiply V100上的测试对比: 运行内容“./matMul wA1024…

Python文件操作命令

文件操作 我知道你最近很累,是那种看不见的、身体上和精神上的疲惫感,但是请你一定要坚持下去。就算无人问津也好,技不如人也好,千万别让烦躁和焦虑毁了你的热情和定力。别贪心,我们不可能什么都有,也别灰心…

Java进阶-反射的详解与应用

本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…

【微服务】软件架构的演变之路

目录 单体式架构的时代单体式架构(Monolithic)优点缺点适用场景单体式架构面临诸多问题1.宽带提速,网民增多2.Web2.0时代的特点问题描述优化方向 集群优点缺点适用场景搭建集群后面临诸多问题用户请求问题用户的登录信息数据查询 改进后的架构 垂直架构优点缺点 分布…

浅谈 kafka

引言 同事在公司内部分享了关于 kafka 技术一些相关的内容,所以有了这篇文章;部分图片选自网络摘抄; 1 Kafka概述 1.1 定义 Kafka传统定义:kafka是一个分布式的基于发布/订阅模式的消息队列。 Kafka最新定义:kafka…

图论- 最小生成树

一、最小生成树-prim算法 1.1 最小生成树概念 一幅图可以有很多不同的生成树,比如下面这幅图,红色的边就组成了两棵不同的生成树: 对于加权图,每条边都有权重(用最小生成树算法的现实场景中,图的边权重…