MySQL事务基础知识

news2024/11/28 11:51:19

前言

学习/导流:

小林coding - 事务篇

学习意义

  • 理解MySQL如何去处理并发问题,借鉴其思想
  • 存储作为应用的关键能力,而事务作为关系型数据库的关键概念,掌握很必要,也为分布式事务学习做奠基

相关说明

该篇博文是个人阅读的重要梳理,仅做简单参考,详细请阅读小林coding的原文!

一、基本场景

银行转账示例:

对于用户来说,转账是一件事情,即用户A把钱转到用户B。现实中,用户A直接把钱(x)递给用户B,表现出来则为用户A减少x,用户B增加x。

假设用户A 的余额acount=y,用户acount=z;.那么 简单地进行计算,则需要 y-x. z+x.才能算该次转账成功。

对于计算机的指令计算,y-x,z+x则会进进行多次计算操作(包括i++,实际上也不是跟不上的原子性,通过汇编也可发现会经过取值、计算多步操作)。

对于应用来说,还需要引入数据库第三方的存储软件来存储 用户的各自余额,那么这中间的计算步骤更长,出错。

为了保证不出现中间状态,要么转账成功、要么失败。数据库则引入了事务的概念。

注:这也是抽象的魅力吧,屏蔽底层细节,只为用户保证简洁、正确的处理结果。

基本手段:若所有操作成功则进行提交事务,失败则进行回滚。

二、事务特性

事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。

不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。

  • A(Atomic)原子性:基本手段,进行操作的捆绑、封装,也有点组合思想,将不同的操作组合为一个事务,对用户视角又是一个新的操作。一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态。
  • C(consistency)一致性:目标,事务的最终目标是保证正确性、给用户看到正确的计算结果,不能产生相互矛盾,则需要数据一致性,而其他三个特性都是为了实现该特性。指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
  • I(isolation)隔离性:基本手段,由于数据库设计为多个应用的存储系统,因此需要考虑并发控制。而单靠原子性只能保证该事务事实上的正确性,却无法保证每个应用的视角正确性,可能存在相互影响的情况。而隔离性则是保证 各个 读写操作互不影响。
  • D(durability)持久性:基本手段,对于处理过的数据需要进行永久存储、持久化。就像时间流逝之后所发生的的事情就永远无法改变,尘封于世间。但数据库其实也可以存在物理删除、逻辑删除,不管怎么样,都需要去记录。

对于以上特性,MySQL的InnoDB采用以下方式去实现。

**原子性:**通过 undo log(回滚日志) 来保证的;

**持久性:**通过 redo log (重做日志)来保证的;

**隔离性:**通过 锁机制、MVCC 来保证的;

一致性则是通过持久性+原子性+隔离性来保证;

对于原子性和持久性问题,InnoDB已经采用日志去内部保证了。暂时去了解、学习相应日志设计原理及思想即可。先主要来分析一下隔离问题,也是程序员应对复杂性问题(并发性处理)的关键能力。

三、并发问题

就像CPU调度进程一样,存在一定的临界资源,竞争。那么则会产生并发问题。对于数据库来说,采用C\S架构,并通过TCP进行提供客户端给用户应用程序连接,可能会存在操作相同的数据(数据库的单位一般为 表、记录,借此可梳理 进程并发问题的临界资源是什么? 代码块,本质是内存? 计算来源于对存储的数据操作 ,落脚需要在 数据对象上,分析其数据的粒度、单位)。那么则会存在并发问题。关于数据库的并发问题主要为以下:

  • 丢失或覆盖更新
  • 未确认的相关性(脏读)
  • 不一致的分析(不可重复读)
  • 幻读

丢失

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

例如 用户A对acount+ x,用户B对acount+y。他们同时进行更新,则会都从最初的值,即acount操作。若用户A的更新在后面则会覆盖B的操作,从acount+y覆盖为acount+x。若保证用户A和B的先后则不会产生此种情况。

脏读

如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。理解脏读的取名,脏读,读取到脏数据(中间状态数据、因为引入了事务的概念,对于未提交的数据都不能算最终处理的数据,因为它随时会因为错误等原因回滚)

当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。

在这里插入图片描述

因为事务 A 是还没提交事务的,也就是它随时可能发生回滚操作,如果在上面这种情况事务 A 发生了回滚,那么事务 B 刚才得到的数据就是过期的数据,这种现象就被称为脏读、

不可重复读

一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象**。**

当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。

不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。

在这里插入图片描述

幻读

一个事务内多次查询某个符合查询条件的**「记录数量」**,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。【虽然某行数据未被修改,但中间可能存在进行删除或插件新的行了】

在这里插入图片描述

并发问题的来源:事务的组合情况(读、写及次数),提交情况。根据这些情况去讨论。以上组合有:

  • 事务A:写;事务B:写。
  • 事务A:读;事务B:写(但未提交)。
  • 事务A:读、读;事务B:写(修改所读的数据);
  • 事务A:读、读;事务B:写(影响的是行数);

四、隔离级别

MySQL为解决上述的并发问题,进行了以下四种隔离级别措施保护。性能和正确性往往是对立的,在追求性能的同时,那么正确性则会向下降。随着隔离级别的增大,性能也会随之增大。

  • 读未提交(read uncommitted,指一个事务还没提交时,它做的变更就能被其他事务看到;
  • 读提交(read committed,指一个事务提交之后,它做的变更才能被其他事务看到;【可解决脏读问题】
  • 可重复读(repeatable read,指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;【可解决不可重复读问题】
  • 串行化(serializable;会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;【可解决幻读问题】

注:在解决不可重复读的情况下,绝大数也是不会产生幻读的。【对于串行化会性能大大下降,因此一般不提倡将隔离级别上升至串行化】

解决幻读的主要办法:

  • 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。

  • 针对当前读(select … for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

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

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

相关文章

快速搭建springboot程序

SpringBoot快速入门 观狂神讲解视频笔记 【狂神说Java】SpringBoot最新教程IDEA版通俗易懂 第一个springboot程序 使用 idea 可以快速构建一个 springboot 的项目: 1.创建新项目,选择 spring initializr(会默认通过官网快速构建&#xff09…

【编程经验】如何学习编程语言的秘诀,编程语言选择,按需学习

大家好,欢迎来到停止重构的频道。最近有些朋友问我们如何学习编程、初学软件的问题,我们打算出几期内容聊聊我们的建议。本期聊一下如何学习编程语言。我们将压箱底的诀窍介绍给新手朋友,当然这仅仅是我们的一些经验,并不是绝对的…

连续四年第一!

近日,IDC发布《2022 H1中国AI云服务市场研究报告》,百度智能云连续四年市场份额第一,整体占比28.1%,在"人体人脸"、"图像视频"‍两个规模最大的子市场继续保持第一。‍‍ 在图像视频等多个领域蝉联市场第一 …

PLC算法系列之数值积分器(Integrator)

数值积分和微分在工程上的重要意义不用多说,闭环控制的PID控制器就是积分和微分信号的应用。流量累加也会用到。有关积分运算在流量累加上的应用,请参看下面的文章链接: SMART S7-200PLC流量累计算法实现(梯形图算法详解+优化)_RXXW_Dor的博客-CSDN博客_smart 200 流量积分…

【bootstrap】使用,初学者的总结

官网&#xff1a;bootstrap中文网 首页点击v3文档&#xff0c;然后下载最左边的那个。 解压后把里面的css和js文件复制过去&#xff0c;因为也要用到jQuery&#xff0c;所以要把jQuery.min.js也一起放入js文件夹。 然后&#xff0c;就是导入&#xff1a; <link rel"s…

Java互联网支付系统源码,基于SpringBoot,含支付宝,微信,银联详细代码案例

spring-boot-pay 支付服务&#xff1a;支付宝&#xff0c;微信&#xff0c;银联详细 代码案例 (支付宝和微信支付测试均需要企业认证&#xff0c;如果没有企业推荐使用 [服务商模式] 申请开通个人商户 也可以测试 )&#xff0c;项目启动前请仔细阅读 注意事项 :fa-hand-o-left…

快速上手 BearPi-HM Micro 一个带显示屏的开发板

一、前言 为什么要写这篇文章呢? 华为官方给OpenHarmony分:南向开发 和 北向开发 北向开发:应用APP开发 南向开发:设备开发 带显示屏的设备,可以更好的使用可视化界面,能更直接的利用烧录到设备里面的代码。 例如:冰箱上面的小的显示屏,可以更好的操控和观察当前冰箱…

一个 web 开发者眼中的技术美术(TA—Technical Artist)

Techical Artist 的中文翻译是技术美术&#xff0c;相比于直译为技术艺术家&#xff0c;技术美术这个称谓让我感觉更加亲切&#xff0c;当然艺术家这个称谓也很好&#xff0c;很高级 :p 。在游戏行业里我们常常能听到美术这个职业&#xff0c;而技术美术&#xff0c;从字面意思…

微信公众号活动策划方案怎么写?看完你也可以直接套用

一场成功的活动策划可以给企业带来相当可观的用户流量和曝光&#xff0c;前提是你的这份公众号活动策划方案是可执行和有回报的&#xff01; 毫不夸张的说&#xff0c;我们在写公众号活动策划方案之前&#xff0c;只要你搞清楚以下这几点&#xff0c;这个方案就可以说是成功了…

介绍一个MySQL参数检索工具

碰巧看到徐老师的这篇文章《MySQL的参数工具》&#xff0c;其中介绍了一个讲解MySQL不同版本参数的小工具&#xff0c;网站的作者是MySQL日本用户组的负责人Tomita。该网站能够提供不同版本MySQL的参数&#xff0c;包括不同版本之间的对比。当用户需要对MySQL进行升级、需要确认…

用javascript分类刷leetcode13.单调栈(图文视频讲解)

84. 柱状图中最大的矩形 (hard) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 …

2022年总结与2023年展望

又是疫情的一年&#xff0c;所幸年尾的政策看来是要全面开放了&#xff0c;也算是一件好事了。但是明年会不会就要强制线下上课导致实习不方便&#xff0c;这也是个问题。 技术学习 确定了自己的方向是走C/CLinux后端开发方向&#xff0c;跟着课程学到了一个图床后端的项目&a…

前端页面插件集成-Markdown编辑器

页面插件集成-Markdown下载MarkDown的插件包引入css、js、Jquary文件定义一个textarea区域作为MarkDown的载体初始化Markdown编辑器最终效果下载MarkDown的插件包 下载地址如下&#xff1a; 下载传送门 点击Github下载&#xff0c;然后解压 解压之后将如下文件夹和 js 文件cop…

贷后联动管控指标与差异化案件的分配逻辑

在风控精细化运营的当下&#xff0c;贷后工作的开展&#xff0c;越来越需要精细化管理。如何做好相关的精细化管理工作&#xff0c;首先我们从这些贷后相关的名词如下开始熟悉&#xff1a; 贷后基本催收名词解释 Flow Rate 迁移率就是在贷后资产评估里最重要的报表了&#xf…

【C语言进阶】还说不会?一文带你全面掌握计算机预处理操作

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f348;一、宏与函数&#x1f348;&#xff1a; 1.宏与函数对比&#xff1a; 2.宏与函数的命名约定&#xff1a; &#x1f353;二、预处理操作符&#x1f353;&#xff1a; 1.预处理操作符 " # "&#xff…

C语言学生成绩管理系统

程序示例精选 C语言学生成绩管理系统 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C语言学生成绩管理系统>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 …

DFS算法-leetcode java题解

DFS算法-leetcode java题解 本文目录DFS算法-leetcode java题解leetcode 547. 省份数量leetcode 463. 岛屿的周长leetcode 200. 岛屿数量leetcode 130. 被围绕的区域leetcode 417. 太平洋大西洋水流问题leetcode 17. 电话号码的字母组合leetcode 22. 括号生成leetcode 39. 组合…

List 容器的接口使用、迭代器失效(仅erase)

目录 一、接口使用 ① 构造函数 ②迭代器 ③ 容量与元素修改 ④ remove ⑤remove_if ⑥ unique ⑦sort&#xff08;&#xff09; ⑧ merge() 二、对于迭代器失效问题 一、接口使用 ① 构造函数 void MyListTest1() {list<int> l1;list<int> l5(10, 5);vector…

〖产品思维训练白宝书 - 产品思维认知篇⑦〗- 聊一聊 产品经理 的工作内容与职责划分

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

自定义类型【c语言】

前言&#xff1a; c语言提供了丰富的内置类型&#xff0c;但是在描述一些复杂对象的时候仍不能满足一定的功能&#xff0c;因此c语言为了支持我们能描述一些复杂对象给出了我们能自定义的一些类型&#xff0c;因此便有了自定义类型。 在之前我们已经初步对结构体进行相应的了解…