当前位置: 首页 > news >正文

MySQL专题Day(1)————事务

博主开新坑啦,主要是从细致的角度为了和各位一起学习分享后端知识,当然AI面经也将尽快更新。下面的知识为博主学习笔记,笔记知识来源参考视频教程(对应的事务有关章节):51. 基础-事务-简介_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Kr4y1i7ru?spm_id_from=333.788.videopod.episodes&vd_source=7276e08eb5d2cd9036ee79547df6412d&p=51

目录

事务定义💡

MySQL中手动提交事务的步骤🔧

方法一

方法二

事务四大基本属性(ACID)🏆

并发事务引发的问题——(这里将详细讲清楚脏读、不可重复读、幻读)🚨

脏读🧹

定义:一个事务读取到另一个事务还没有提交的数据。

例子(“我改了,我没交,但是你却已经可以看见了”)

不可重复读🔄

定义:一个事务先后读取同一条记录,但是两次读取数据都不同。

例子(“我查了一次,但查的同时你交了,再查发现结果和前一次不同了”)

幻读 👻

定义:在隔离级别解决了不可重复读的问题前提下,一个事务按照条件查询数据时,没有对应的数据行,但是在插入的数据的时候发现已经存在相应的数据行了。就像出现了幻影数据一般。

例子(解决不可重复读后,我查了一次没有相应数据,但想插入,却发现又存在对应的数据行了。就像是数据隐形了一般!!!)

事务的隔离级别——解决事务并发问题🛡️

查看事务的隔离级别🔍

读未提交

读已提交(Oracle默认隔离级别)

可重复读(MySQL默认隔离级别)

串行化⚠️

知识复习导图


事务定义💡

一组操作的逻辑集合,是一个不可分割的工作单位。事务会将所有操作视作是一个整体,一起向系统提交或者撤销。即:这组操作要么同时成功,要么同时失败。

Tips:在MySQL数据中默认将一条DML语句当作隐式提交事务。


MySQL中手动提交事务的步骤🔧

这里各位可以采用一些带有GUI的连接工具(Sqlyog、Navicat或者是MySQL自带的连接操作GUI界面)或者直接终端操作MySQL,这里本质是在一个连接会话中进行操作。

方法一

1.首先查询 @@autocommit值是否为1

select @@autocommit

2.将其更新设置为0。(表示关闭自动提交)

set @@autocommit = 0

3.选中要执行的单个SQL或者一组逻辑集合,执行。

4.执行完毕后,一定要额外加上commit;如果出现异常则直接进行回滚即可。Rollback。

--提交
COMMIT;
--回滚
ROLLBACK;

方法二

1.在需要开启事务的地方编写start transaction或者begin

2.编写相应SQL操作语句——逻辑代码

3.需要结束的地方直接加上commit 或者 rollback

--COMMIT代码
--表示事务开始 也可以用BEGIN替代
START TANSACTION;--DO SOMETHING--提交事务
COMMIT;
--回滚的代码
--表示事务开始 也可以用BEGIN替代
START TANSACTION;--DO SOMETHING--回滚
ROLLBACK;

⚠️值得注意的是:如果在出现异常的情况下,仍然采用COMMIT则会将执行成功的SQL提交,失去了事务同生共死的属性,也就是说这个逻辑集合本质就失去了称为事务的资格。因此,在正常业务中如果出现异常,一定采用回滚操作!


事务四大基本属性(ACID)🏆

原子性Atomic):事务是不可分割的单元,要么全部成功,要么全部失败

一致性Consistency):事务完成的时候,必须使得所有数据状态保持一致

隔离性Isolation):数据库可提供的事务隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性Durability):事务一旦提交或者回滚,其对于数据库的影响就是永久性的。


并发事务引发的问题——(这里将详细讲清楚脏读、不可重复读、幻读)🚨

脏读🧹

定义:一个事务读取到另一个事务还没有提交的数据。

例子(“我改了,我没交,但是你却已经可以看见了”)

两个并发事务A和B,B先对数据库表id = 1数据进行修改,但还未提交,A进行查询就查询到了B还没有提交修改后的数据了。

不可重复读🔄

定义:一个事务先后读取同一条记录,但是两次读取数据都不同。

例子(“我查了一次,但查的同时你交了,再查发现结果和前一次不同了”)

两个并发事务A和B,A先查询了一条id=1数据,另外并发的事务B将id = 1这条数据修改后,然后A再次查询查询到了B修改后的值。

幻读 👻

定义:在隔离级别解决了不可重复读的问题前提下,一个事务按照条件查询数据时,没有对应的数据行,但是在插入的数据的时候发现已经存在相应的数据行了。就像出现了幻影数据一般。

例子(解决不可重复读后,我查了一次没有相应数据,但想插入,却发现又存在对应的数据行了。就像是数据隐形了一般!!!)

两个并发事务,A和B,A首先做一次查询操作查找ID为1的数据记录,发现并没有ID为1的记录,此时,B先于A插入提交了一条ID为1的记录,但是A的下一步操作也是希望插入ID为1的记录,但此时却无法插入,因为A不知道B已经向其中插入了一条Id为1的记录了,于是A再次查询,发现仍然没有相应ID为1的记录。好像有幻影数据存在!!


事务的隔离级别——解决事务并发问题🛡️

查看事务的隔离级别🔍

SELECT @@TRANSACTION_ISOLATION

读未提交

  • 不解决任并发问题。🚫
--设置方法
SET SESSION/GLOBAL TASACTION LEVEL READ UNCOMMITED

读已提交(Oracle默认隔离级别)

  • 解决脏读问题✅

--设置方法
SET SESSION/GLOBAL TASACTION LEVEL READ COMMITED

可重复读(MySQL默认隔离级别)

  •  解决不可重复读 + 脏读,但无法解决幻读🔄

--设置方法
SET SESSION/GLOBAL TASACTION LEVEL REPEATABLE READ

串行化⚠️

  • 解决幻读问题,牺牲了所有并发性能。(不再支持事务并发)

--设置方法
SET SESSION/GLOBAL TASACTION LEVEL SERIALIZABLE

   ⚠️值得注意的是:当设置事务隔离级别为SERIALIZABLE后,若开启并发事务操作相同数据(如同时修改同一张表),后续事务在首次执行冲突操作(如UPDATE/DELETE)时会被阻塞。这种阻塞会持续到前一个事务完成(COMMIT或ROLLBACK),此时被阻塞的事务会根据前事务结果决定继续执行或报错。


知识复习导图

http://www.dtcms.com/a/360388.html

相关文章:

  • postman 用于接口测试,举例
  • Linux shell 脚本基础 003
  • centos7安装jdk17
  • c++程序员日常超实用工具(长期记录更新)
  • PS自由变换
  • 【人工智能99问】LLaMA中的RoPE是什么?(35/99)
  • 学习Python中Selenium模块的基本用法(12:操作Cookie)
  • 【系统分析师】高分论文:论大数据架构的应用
  • 写一个 RTX 5080 上的 cuda gemm fp16
  • 使用yt-dlp下载网页视频
  • synchronized的锁对象 和 wait,notify的调用者之间的关系
  • Wi-Fi技术——初识
  • Flink NettyBufferPool
  • Docker中使用Compose配置现有网络
  • C语言————深入理解指针1(通俗易懂)
  • Linux 网络编程:深入理解套接字与通信机制
  • 【MySQL自学】SQL语法全解(上篇)
  • Matlab自学笔记六十六:求解带参数的不等式
  • MySQL服务启动命令手册(Linux+Windows+macOS)(下)
  • 盛最多水的容器:双指针法的巧妙运用(leetcode 11)
  • ARM裸机开发(基础汇编指令)Day02
  • [特殊字符] Rust概述:系统编程的革命者
  • Python轻量化革命:用MicroPython构建边缘智能设备
  • JavaWeb01
  • Linux-驱动积累
  • 浅层与深层语义分析的NLP进化论
  • Trie树(静态数组实现)
  • 云渲染如何重新定义视觉艺术的边界
  • JS接口请求的基本方法
  • FastAPI 核心实战:精通路径参数、查询参数与数据交互