【MySQL】事务篇

SueWakeup

                                                      个人主页:SueWakeup

                                                      系列专栏:学习技术栈

                                                      个性签名:保留赤子之心也许是种幸运吧

  

目录

本系列专栏

 1. 什么是事务

2. 事务的特征

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

持久性(Durability)

3. MySQL实现事务的步骤

3.1 关闭事务自动提交

3.2 开启一个事务,标记事务的起始点

3.3 向数据库提交事务

3.4 将事务回滚,所有数据库操作被取消

3.5 开启mysql自动提交

4. 数据库事务的实现原理

5. 什么是 MVCC?

6. 数据库并发事务,会带来哪些问题?

脏读

不可重复读

丢失修改

幻读

7. 不可重复读和幻读的区别

8. 事务的隔离级别

读未提交

读已提交

可重复读

可串行化

注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转   


本系列专栏

1.数据库排名

2.【MySQL】数据库开篇

3.【MySQL】索引篇

4.【MySQL】事务篇

5.【MySQL】锁篇


 1. 什么是事务

  • 事务是数据库的一种特性,用于确保一个执行过程中所有步骤全部成功或者全部失败,是数据库操作的最小执行单元

2. 事务的特征

原子性(Atomicity)

事务是数据库的最小执行单元,事务的原子性确保数据库操作过程中的所有步骤全部成功或者全部失败

一致性(Consistency)

数据修改前和修改后的状态保持一致

隔离性(Isolation)

一个事务的执行不会被其他事务干扰,一个事务内部的操作和使用的数据,在并发中对其他事务是隔离的

持久性(Durability)

事务一旦被提交,将对数据库中的数据的改变是永久性的


3. MySQL实现事务的步骤

3.1 关闭事务自动提交

set autocommit=0;

3.2 开启一个事务,标记事务的起始点

start transaction;

3.3 向数据库提交事务

commit;

3.4 将事务回滚,所有数据库操作被取消

rollback;

3.5 开启mysql自动提交

set autocommit=1;

4. 数据库事务的实现原理

  • MySQL InnoDB引擎使用 redo log(重做日志)保证事务的的持久性,使用 undo log(回滚日志)来保证事务的原子性
    • redo log 是 InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值。当MySQL意外宕机,InnoDB存储引擎会使用 redo log恢复,以此来确保数据的持久性
    • undo log保存了事务发生之前的数据的一个版本,用于回滚
  • MySQL InnoDB引擎通过锁机制、MVCC(多版本并发控制)等手段保证事务的隔离性
  • 保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障

5. 什么是 MVCC?

  1. MVCC是行级锁的一个变种,在很多情况下避免了加锁情况,开销更低。
  2. 大多数的MVCC都实现了非阻塞的读操作,写操作也只锁定必要的行;
  3. MVCC是一种用来解决 读-写冲突的并发控制,为事务分配单向增长的时间戳,为每个修改保存一个版本,每个事务都有一个对应版本的快照,快照版本按照单向增长的时间戳来决定先后顺序
  4. 读操作,只需要读该事务开始前的数据库快照,并不去读取正在修改的数据,仅读取事务开始前的最新版本

6. 数据库并发事务,会带来哪些问题?

脏读

一个事务正在访问数据并且对数据进行了修改,而修改操作还没提交到数据库中,这时另外一个事务也访问这个数据,然后使用这个数据。由于这个数据是没有提交的数据,那么另外一个事务读到的这个数据就是“脏数据”

不可重复读

一个事务内多次读同一个数据,在这个事务还没结束时,另外一个事务也访问该数据,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务读取到的数据可能不一致,这就发生了在一个事务内两次读到的数据是不一致的情况,所以称为不可重复读

丢失修改

一个事务读取一个数据时,另外一个事务也访问这个数据,在第一个事务修改这个数据后,第二个事务也修改了这个数据导致第一个事务的修改丢失

幻读

与不可重复读类似,在第一个事务读取了几行数据,另一个事务插入了一些数据,在随后的查询中,第一个事务发现多了一些原本不存在的记录


7. 不可重复读和幻读的区别

  • 不可重复读的重点是修改,多次读取一条记录,发现其中某些列的值被修改
  • 幻读的重点在于新增或删除,比如多次读取某条件下的记录,发现记录增多或减少

8. 事务的隔离级别

读未提交

最低的隔离级别,允许读取尚未提交的数据变更,可能导致 脏读、幻读或不可重复读

读已提交

允许读取并发事务已经提交的数据,可以阻止脏读

可重复读

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读

可串行化

最高的隔离级别,完全服从 ACID 的隔离级别,所有的事务依次逐个执行,防止事务之间产生干扰,可阻止脏读、不可重复度以及幻读


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

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

相关文章

# Contrastive Learning(对比学习)--CLIP笔记(一)

Contrastive Learning(对比学习)–CLIP笔记(一) 参考:CLIP 论文逐段精读【论文精读】_哔哩哔哩_bilibili CLIP简介 CLIP是一种多模态预训练模型,由OpenAI在2021年提出,论文标题:L…

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。 该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层。各层基…

Mouse IFN-α ELISA kit (Quick Test)

干扰素α(IFN-α)是一类由免疫细胞分泌的内源性调节因子,也被称为白细胞干扰素,主要参与响应病毒感染的先天性免疫。 基于结构特征、受体、细胞来源和生物活性的不同,干扰素可被分为Ⅰ、Ⅱ、Ⅲ三种类型,其中…

一起学习python——基础篇(17)

今天我说一下python中有关文件的操作。 1、检测一个目录里面有无这个文件夹、有无txt文件,代码如下: import os #文件的路径 testPath"D:/pythonFile" testPath2"D:/pythonFile/test.txt" #使用exists()方法检查是否存在文件…

RREA论文阅读

Relational Reflection Entity Alignment 关系反射实体对齐 ABSTRACT 实体对齐旨在识别来自不同知识图谱(KG)的等效实体对,这对于集成多源知识图谱至关重要。最近,随着 GNN 在实体对齐中的引入,近期模型的架构变得越来越复杂。我们甚至在这…

Power BI报告在PPT中实时刷新的实现技巧分享

前面我们刚介绍了如何在PPT中展示Power BI报告? 很巧的是,在刚刚的Power BI 2024年4月更新的诸多新特性中,PPT中使用的Power BI插件又有新特性的更新,数据自动刷新功能(新特性仅限国际版使用),这个新特性支持最低15秒…

软件定义车队面临网络安全的曲折之路

当以色列 REE Automotive 设计其 P7 电动汽车底盘时,它是从软件开始工作的:扁平的车辆底盘完全可配置,每个轮胎附近有四个独立的模块,用于转向、制动、悬架和动力传动系统,每个模块均由电子驱动控制单元(EC…

网络协议——OSPF(开放式最短路径优先)详解

1.什么是OSPF 开放式最短路径优先OSPF 是一种动态的高度可靠和高度可扩展的路由协议,用于构建大型网络中的动态路由系统 2. OSPF的协议号为:89 3. OSPF的特点: OSPF是链路状态协议使用了区域概念:减少路由选择协议对路由器CPU,…

【LeetCode】二叉树类题目详解

二叉树 二叉树的理论基础 二叉树是结点的度数之和不超过2的树,二叉树总共有五种基本形态 二叉树的种类主要有: 满二叉树完全二叉树 二叉树的存储方式 顺序存储链式存储 二叉树的遍历方式 先序遍历(深度优先搜索)中序遍历&…

蓝桥杯-STL-string

目录 字符串定义 字符串初始化 字符串输入输出 字符串输出 字符串输入 字符串访问 字符串拷贝 字符串拼接 直接相加 append(const char*str,int n) 字符串比较 ​编辑字符串长度length()/size() 字符串查找find(string str) 查找子串substr(int a,int b) 字符串的…

秋招数据库学习2(20240408-20240412共10道)

由于感觉数据库难度可能暂时面试用不到,就先不刷啦 20240408 1.从不订购的客户 SELECT Name AS Customers FROM Customers C LEFT JOIN Orders O ON C.Id O.CustomerId WHERE CustomerId is nullselect customers.name as Customers from Customers wher…

手写ArrrayList

需求 自定义的MyArrayList import java.util.Arrays; import java.util.Objects;public class MyArrayList<E> {private Object[] elementData ; // 存储元素的数组private int size; // 记录 的元素个数private static final int DEFAULT_CAPACITY 10; // 默认容量// …

Eigen笔记2:矩阵拼接

直接贴代码吧&#xff0c;使用的MatrixXd 和<<运算符&#xff1a; int main(int argc, char *argv[]) {Eigen::MatrixXd B(2, 2);B << 1, 2,3, 4;Eigen::MatrixXd C(2, 2);C << 5, 6,7, 8;Eigen::MatrixXd D(2, 2);D << 9, 10,11, 12;Eigen::MatrixXd…

基于React封装Handsontable并兼容antd

背景 其实Handsontable官方也提供了React的版本&#xff0c;但是官方的版本再编辑和渲染的时候并不能够很好的嵌入第三方的组件库。这就导致了&#xff0c;使用了Handsontable就没有办和普通的react项目一样轻松引用其他第三方组件。因此对其react的版本进行了二次的封装&#…

Django中间件路由映射自动加/斜杠问题原因及分析

输入 http://127.0.0.1:8000/main/index/ 输入 http://127.0.0.1:8000/main/index 路由定义情况 urlpatterns [path("index/", views.index) ]可以发现我在输入URL的index路由时&#xff0c;如果没有和Django定义的路由匹配规则一样的话&#xff0c;浏览器自…

Vim:强大的文本编辑器

文章目录 Vim&#xff1a;强大的文本编辑器Vim的模式命令模式常用操作光标移动文本编辑查找和替换 底行命令模式常用操作Vim的多窗口操作批量注释与去注释Vim插件推荐&#xff1a;vimforcpp结论 Vim&#xff1a;强大的文本编辑器 Vim&#xff0c;代表 Vi IMproved&#xff0c;…

如何确保软件通过SmartScreen验证,消除用户下载时的警告提示?

在当前的网络时代&#xff0c;各种软件应用程序深深渗透到人们的日常生活和工作中&#xff0c;许多企业选择自行开发应用程序以推进其业务发展。但在发布应用程序后&#xff0c;软件所有者经常会遇到一个挑战&#xff0c;即用户在下载时可能会遇到微软SmartScreen提示“此应用程…

探索HTTP协议的世界 | 从基础到高级应用,原理与实践相结合(请求篇)

从基础到高级应用&#xff0c;原理与实践相结合 什么是Http历代Http协议主要特点格式和URL协议内容请求行格式如下请求方法简单案例 消息报头报头域的格式HTTP消息报头类型普通报头优化方向报头&#xff08;缓存&#xff09;Cache-Control的选项其他相关的缓存报头 请求报头Acc…

Unity TMP Inputfield 输入框 框选 富文本 获取真实定位

一、带富文本标签的框选是什么 UGUI的InputField提供了selectionAnchorPosition和selectionFocusPosition&#xff0c;开始选择时的光标下标和当前光标下标 对于未添加富文本标签时&#xff0c;直接通过以上两个值&#xff0c;判断一下框选方向&#xff08;前向后/后向前&…

C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色

实现效果 调用方法 rtxtLog.AppendTextColorful(richTextBox1,DateTime.Now.ToString(), Color.Red); 完整代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…