MySQL进阶:MySQL事务、并发事务问题及隔离级别

news2024/11/16 13:27:18

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习、
🌌上期文章:MySQL进阶:视图&&存储过程&&存储函数&&触发器
📚订阅专栏:MySQL进阶
希望文章对你们有所帮助

这一部分内容还是很重要的,虽然学起来感觉不是很难,但是要多体会一下,体会好这里的精髓才能更好的理解MySQL事务的锁。

MySQL事务及隔离级别

  • 简介
  • 事务操作
    • 未控制事务
    • 控制事务一
    • 控制事务二
  • 事务四大特性(高频面试题)
  • 事务并发问题(重点)
  • 事务隔离级别

简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
就比如转账,包括加钱和减钱的操作,这一组操作必须在一个事务的范围内,要么都成功,要么都失败。

默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐
式的提交事务。

事务操作

create table account(
 id int primary key AUTO_INCREMENT comment 'ID',
 name varchar(10) comment '姓名',
 money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

未控制事务

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

"出错了…"这句话会报错,若不加事务,就会导致张三的钱减少,但是李四的钱没有增加,这就违背了数据一致性

控制事务一

1、查看/设置事务提交方式

SELECT @@autocommit ;
SET @@autocommit = 0 ;

2、提交事务

COMMIT;

3、回滚事务

ROLLBACK;

上述的这种方式,是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。

控制事务二

1、开启事务

BEGIN;START TRANSACTION;

2、提交事务

COMMIT;

3、回滚事务

ROLLBACK;

事务四大特性(高频面试题)

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

事务的四大特性,简称ACID。

事务并发问题(重点)

1、脏读:一个事务读到另外一个事务还没有提交的数据。
在这里插入图片描述
B事务的select操作读取到了DB中id=1的数据,但读出来的是事务A执行update后的数据,但事务A根本还没有提交事务。

2、不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
在这里插入图片描述
注意:假设此时已经解决了事务的脏读问题
事务A两次读取同一条记录,但是读取到的数据却是不一样的。这是因为在两次select操作之间有一个事务B提交了,事务就是将这一行的数据修改了。

3、幻读:一个事务按照条件查询数据时,没有对应数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。
在这里插入图片描述
注意:假设此时已经解决了事务的脏读问题和不可重复读问题

1、事务A执行select,确认了数据库没有id=1的数据
2、事务B执行insert,数据库中增加了id=1的数据
3、事务A执行insert,由于id=1的数据已经存在,无法插入
4、事务A再次执行select,由于已经解决了不可重复读的问题,此时事务A还是没办法获取到id=1的数据

这就是幻读,明明查不到,却插入不进去。

事务隔离级别

为了解决并发事务问题,数据库中引入了事务的隔离级别:

隔离级别脏读不可重复读幻读
Read uncommitted
Read commited×
Repeatable Read(默认)××
Serializable×××

1、查看事务的隔离级别:

SELECT @@TRANSACTION_ISOLATION;

2、设置事务隔离级别:

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | 
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

需要注意的是,事务的隔离级别越高,数据自然越安全,但是性能会更低。

在这里我们可以看到,MySQL默认的事务隔离级别是RR,脏读和不可重复读的问题是已经解决了,但幻读问题的解决方法是要加一个行级锁——间隙锁&临键锁。

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

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

相关文章

今日学习总结2024.3.2

最近的学习状态比较好,感觉非常享受知识进入脑子的过程,有点上头。 实验室一个星期唯一一天的假期周六,也就是今天,也完全不想放假出去玩啊,在实验室泡了一天。 很后悔之前胆小,没有提前投简历找实习&…

实现数组方法 forEach map filter every

手写forEach Array.prototype.myforEach function (fn, thisValue) {let index 0;let arr thisValue || this;if (typeof fn ! function) {throw new TypeError(fn is not a function)}while (index < arr.length) {if (index in arr) {fn.call (thisValue, arr[index],…

VUE3中的组件传值

一、父传子(props) 在子组件中可以使用defineProps接收父组件向子组件的传值 父组件fatherPage.vue&#xff1a; <template><div class"father"><button click"a a 1">按钮</button><childPage :a"a" /><…

【Python】进阶学习:pandas--groupby()用法详解

&#x1f4ca;【Python】进阶学习&#xff1a;pandas–groupby()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448;…

全面整理!机器学习常用的回归预测模型

Datawhale干货 作者&#xff1a;曾浩龙&#xff0c;Datawhale意向成员 前言 回归预测建模的核心是学习输入 到输出 &#xff08;其中 是连续值向量&#xff09;的映射关系。条件期望 是 到 的回归函数。简单来说&#xff0c;就是将样本的特征矩阵映射到样本标签空间。 图…

spring boot 整合 minio存储 【安装篇】

一、minio是什么&#xff1f; MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以…

每日OJ题_牛客_合法括号序列判断

目录 合法括号序列判断 解析代码 合法括号序列判断 合法括号序列判断__牛客网 解析代码 class Parenthesis {public:bool chkParenthesis(string A, int n){if (n & 1) // 如果n是奇数return false;stack<char> st;for (int i 0; i < n; i) {if (A[i] () {s…

【Godot4.2】控件节点生成与布局函数库Ctl

前言 本文依旧来自笔者的语雀知识库。基础内容写于2023年8月份。当时写的比较随意&#xff0c;本篇将在其基础上扩充和修改。 概述 Godot本身提供了丰富的控件和容器来实现UI布局&#xff0c;但是这个过程往往需要复杂的手动操作和配置&#xff0c;使用代码生成方式时也会需…

java-ssm-jsp-宠物常规护理知识管理系统设计与实现

java-ssm-jsp-宠物常规护理知识管理系统设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

Ubuntu20.04: UE4.27 中 Source Code 的编辑器下拉框没有 Rider选项

问题描述 最近想用 Rider 作为 UE4 开发的 IDE&#xff0c;但安装好 Rider 后&#xff0c;发现编辑器下拉框中没有 Rider 的选项&#xff0c;我检查了 UE4 的插件&#xff0c;发现 Rider Integration 插件已经安装且启用的。 环境&#xff1a;Ubuntu 20.04 UE4.27 Rider2023…

设计模式(十四)中介者模式

请直接看原文: 原文链接:设计模式&#xff08;十四&#xff09;中介者模式_设计模式之中介模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 前言 写了很多篇设计模式的…

洛谷 B3620 x 进制转 10 进制

题目描述 给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码&#xff0c;用 A&#xff0c;B&#xff0c;…… 表示。 输入格式 第一行一个整数 x; 第二行一个字符串 S。 输出格式 输出仅包含一个整数&#xff0c;表示答案。 输入输出样例…

《TCP/IP详解 卷一》第12章 TCP初步介绍

目录 12.1 引言 12.1.1 ARQ和重传 12.1.2 滑动窗口 12.1.3 变量窗口&#xff1a;流量控制和拥塞控制 12.1.4 设置重传的超时值 12.2 TCP的引入 12.2.1 TCP服务模型 12.2.2 TCP可靠性 12.3 TCP头部和封装 12.4 总结 12.1 引言 关于TCP详细内容&#xff0c;原书有5个章…

CSS 自测题 -- 用 flex 布局绘制骰子(一、二、三【含斜三点】、四、五、六点)

一点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-画骰子</title><sty…

Day13:信息打点-JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目

目录 JS前端架构-识别&分析 JS前端架构-开发框架分析 前端架构-半自动Burp分析 前端架构-自动化项目分析 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接…

OJ_重复者

题干 C实现 #include <stdio.h> #include <string.h> using namespace std; void square(int curSize, int patSize, char pattern[3000][3000], char picture[3000][3000], char last[3000][3000]) {if (curSize 1) {for (int i 0; i < patSize; i) {for (i…

《高性能MYSQL》-架构,锁,事务

MYSQL的逻辑架构 第一层&#xff0c;客户端层&#xff1a;包含了连接处理&#xff0c;身份验证&#xff0c;确保安全性等 第二层&#xff0c;包含了mysql大部分的核心功能&#xff0c;查询解析&#xff0c;分析&#xff0c;优化&#xff0c;以及所有的内置函数&#xff08;例如…

Redis--线程模型详解

Redis线程模型 Redis内部使用的文件事件处理器&#xff08;基于Reactor模式开发的&#xff09;file event handler是单线程的&#xff0c;所以Redis线程模型才叫单线程模型&#xff0c;它采用IO多路复用机制同时监听多个socket&#xff0c;当被监听的socket准备好执行accep、r…

深度相机xyz点云文件三维坐标和jpg图像文件二维坐标的相互变换函数

深度相机同时拍摄xyz点云文件和jpg图像文件。xyz文件里面包含三维坐标[x,y,z]和jpg图像文件包含二维坐标[x&#xff0c;y],但是不能直接进行变换&#xff0c;需要一定的步骤来推演。 下面函数是通过box二维框[xmin, ymin, xmax, ymax, _, _ ]去截取xyz文件中对应box里面的点云…

洛谷P5717 三角形分类

给出三条线段a,b,c 的长度&#xff0c;均是不大于 1000010000 的正整数。打算把这三条线段拼成一个三角形&#xff0c;它可以是什么三角形呢&#xff1f; 如果三条线段不能组成一个三角形&#xff0c;输出Not triangle&#xff1b;如果是直角三角形&#xff0c;输出Right tria…