MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~
本篇文章建议读者结合:MySQL中的索引事务(1)索引----》数据库运行的原理知识+面试题~_念君思宁的博客-CSDN博客此时,如果你根据name来查询,查到叶子节点得到的只是主键id,还需要通过主键id去主键的B+树里面在查找一次(一共查找两次B+树)(上述的过程称为“回表”,这个过程是MySQL自动完成的,用户感知不到~)当年看到一张“表”的时候,实际上这个表不一定是按照“表格”这样的数据结构在硬盘上组织的,也有可能是按照这种树(B+树)形式组织(具体是哪种结构,取决于你的表里有没有索引,一级数据库使用了哪种索引~)创建索引的操作,可能很危险,如果表里的数据很大,这个建立索引的开销也会很大……
https://blog.csdn.net/weixin_64308540/article/details/132645268?spm=1001.2014.3001.5501
一同进行深入研究。
在进行MySQL事务讲解之前,我们先来一个银行转账的案列,将会通过这个案列带领大家深入了解事务的概念,特性等知识~~
经典的场景:银行转账~
用户1给用户2进行转账500money~
用户1给用户2进行转账500money~account(id, balance)1 10002 0操作1:
update account set balance = balance-500 where id=1;操作2:
update account set balance = balance+500 where id=2;
假设哈,假设~,在执行转账的过程中,执行完操作1以后,数据库崩溃/主机宕机,此时转账就僵硬了(操作1的钱扣了,操作2的钱没有正常到账)~~
那么事务,就是为了解决上述的问题~,事务的本质是把多个sql语句打包成一个整体(事务的原子性),要么全部都执行,要么就一个都不执行,而不会出现“执行一半的中间状态。
其实不是真的没执行,而是看起来好像跟没执行一样;
执行一半出错了,出错之后选择了恢复现场,把数据还原成未执行之前的状态了!
————》类似于CTRL+Z(撤销)这个恢复数据的操作叫做”回滚“
上面的这个银行转账案列跟淘宝买东西一个道理:如:淘宝买东西,下单的同时需要支付,若账户已扣钱,但是没有生成相对的订单表~~尴尬了这就!!
那么,我们回过来接着看一下刚刚的银行转账问题(操作1的钱扣了,操作2的钱未正常到账)
操作1:
update account set balance = balance-500 where id=1;操作2:
update account set balance = balance+500 where id=2;
如果把这两个操作作为一个事务,当第一个sql执行完以后,数据库崩溃,当下次数据库重新启动完之后,就会自动的把上次修改一半的数据给进行还原(把操作1过程的-500元,再给+回来)。
进行回滚的时候,咋知道回滚是恢复到啥样的状态呢??
此时是需要额外的部分来记录事务中的操作步骤(数据库里专门有个用来记录事务的日志)正因为如此,使用事务的时候,执行sql的开销是更大的,效率是更低的~~
开启事务/提交事务:
开启事务:
start transaction;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~中间部分就是要执行的每一步操作
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
提交事务(到这一步,相当于事务就执行完了
commit;
如下述代码操作:
start transaction;阿里巴巴账户减少2000
update account set money = money-2000 where name="阿里巴巴”;四十大盗账户增加2000
update account set money = money+2000 where name="四十大盗”;commit;
大家看着上述的银行转账案列很容易,但是理解起来却是很困难~
那么接下来我们来看一下数据库的事务,四大特性(八股文,经典面试题)
- 原子性,(最核心的特性)初心
- 一致性,事务执行前后,数据得是靠谱的(转账金额)
- 持久性,事务修改的内容是写到硬盘上的,持久存在的,重启也不会丢失
- 隔离性,这个隔离性是为了解决“并发”执行事务,引起的问题
~~~~~~~~~~~~~最难搞的面试题~~~~~~~~~常考~~~~~~~~~~~~
我们先来了解一下并发:并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。——————内容来自百度百科~~
我们来举例说明一下并发:
在一个餐馆(服务器)同一时刻要给多个顾客(客户端)提供服务,这些顾客提出的请求是“一个接一个的?”,还是“一股脑来了一大批呢?”,此时服务器同时处理多个客户端的请求,称为“并发”(齐头并进)
引起的问题有哪些呢??如果并发的这些事务是修改不同表/不同的数据,那么,没啥事,如果修改的是同一表/同一数据,可能会带来一定的问题,比如:多个客户端一起尝试对同一个账户进行转账操作,此时,就可以会把这个数据搞混了~
隔离性:事务的隔离性存在的意义是为了:在数据并发处理事务的时候,不会有问题(即使有问题,那么该问题也不大~)。
接下来说说:并发处理事务,可能会遇到哪些问题??以及这些问题数据库的隔离性是怎样解决的??(其实这个还是挺麻烦的,需要大家多理解理解)
并发执行事务可能产生的问题:
- 脏读问题
- 不可重复读
- 幻读
接下来,我们来看一下并发执行事务可能产生的三大问题吧~
1.脏读问题:
一个事务A正在对数据进行修改的过程中,还没提交之前,另一个事务B也对同一个数据进行了读取,此时B的读操作,就称为“脏读”,读到达数据也成为“脏数据”,此时所说的脏是指“无效的数据”,为啥说无效呢??原因在于:A可能回头把数据给改了~~(事务B读到的数据不一定是最终结果,可能是无效的数据)
那么,我们又该如何取解决脏读问题呢??
MySQL写了“写操作加锁”这样的机制~
当事务A修改数据到时候,事务B不能读数据,此时,事务A的“写操作”与事务B的“读操作”就不能并发了(不能同时执行了)
“写加锁操作”降低了并发程度(降低了效率)提高了隔离性(提高了事务的准确性)。
2.不可重复读
事务1已经提交了某数据,此时事务2开始去读数据,在读取的过程中,事务3对该数据进行了修改,并提交了新的数据,此时意味着:同一个事务2,多次读数据,读出来的结果是不相同的~(预期是一个事务中,多次读取结果得是一样的),此时,叫做“不可重复读”(第二次读取的结果,不能复现第一次的结果)
为了解决这个问题,MySQL引入“读加锁操作”
通过读加锁,又进一步降低了事务的并发处理能力(处理效率也降低了),提高事务的隔离性(数据的准确性又提高了~)
3.幻读
在读加锁和写加锁的前提下,一个事务两次读取同一个数据,发现读取的数据值是一样的,但是结果集不一样(student.java 代码内容不变,但是第一次看到的只有student.java文件,第二次看到的是student.java和teacher.java这两个文件),这种问题就是幻读
那么,又该如何解决幻读出现的问题呢??
数据库使用“串行化”这样的方式来解决幻读,彻底放弃并发处理事务,一个接一个的串行的处理事务,这样做,并发程度是最低的(效率最慢的),隔离性是最高的(准确性是最高的)。
上述三个问题:脏读(给写加锁),不可重复读(给读加锁),幻读(彻底串行化)就是并发处理事务三个典型的问题~
对应上述问题MySQL提供四种隔离级别,对应上面的几个情况
- read uncommitted : 没有进行任何锁限制,并发最高(效率最高),隔离性最低(准确性最低)~
- read committed :给写加锁,并发程度降低,隔离性提高了~
- repeatable read :给写和读加锁,并发程度又降低了,隔离性又提高了~
- serializable :串行化,并发程度最低,隔离性最高~
上述的四个各类级别,都是MySQL内置的机制,可以通过修改MySQL的配置文件,来设置当前MySQL工作在哪种状态下~
对于上述的三个问题(脏读,不可重复读,幻读),没有办法通过代码来讲解
- 当前没有办法构造并发代码(涉及到多线程,笔者暂时不会嗨~~)
- 读加锁与写加锁啥的,都是MySQL内部的机制,不是代码~~
那么,对于上述的四个级别,该如何选择??
其实这几个级别之间没有好坏之分,这就需要开发者在准确性和效率之间进行权衡,看实际需求,看业务场景~~
- 场景1:转账的时候,一分钱都不能差,哪怕慢点,也得转对,准确性要拉满,效率不关键
- 场景2:抖音点赞,一个视频有多少赞?要求快,赞的数量差十个八个的,都没啥事,追求的是效率,准确性就不怎么关键~
相关文章:
MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~
本篇文章建议读者结合:MySQL中的索引事务(1)索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时,如果你根据name来查询,查到叶子节点得到的只是主键id,还需要通过主键id去主键的B树里面在…...

【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序
文章目录 ⚽冒泡排序⚾算法步骤🎨算法优化🥎代码实现:🏀冒泡排序的特性总结 🧭快速排序⚽算法思路📌思路一(Hoare版)📌思路二(挖坑法)Ὄ…...

小程序的使用
微信小程序开发 外部链接别人的总结查看(超详细保姆式教程) 基础语法 1.数据绑定 1.1 初始化数据 页面.js的data选项中Page({data: {motto: Hello World,id:18} })使用数据 单项数据流:Mustache 语法 a)模板结构中使用双大括号 {{data}} …...

Spring整合tomcat的WebSocket详细逻辑(图解)
主要解决存在的疑问 为什么存在2种spring整合websocket的方式,一种是使用ServerEndpoint注解的方式,一种是使用EnableWebSocket注解的方式,这2种有什么区别和联系?可以共存吗?它们实现的原理是什么?它们的各…...

【笔试强训选择题】Day37.习题(错题)解析
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言一、Day…...

如何使用HTTP代理爬虫,防止对网站造成负面影响
在当今大数据时代,爬虫技术已经成为了获取数据的重要手段之一。但是,由于爬虫程序的高频访问容易对目标网站造成负面影响,如增加服务器负载、影响网站性能等,因此,如何使用HTTP代理爬虫防止对网站造成负面影响成为了一…...
磐基2.0搭建es集群
参考: k8s安装elasticsearch集群 k8s安装elasticsearch集群_k8s部署elasticsearch集群_MasonYyp的博客-CSDN博客1 环境简述搭建es集群需要使用的技术如下:k8s集群、StatefulSet控制器、Service(NodePort)服务、PV、PVC、volumeC…...
Java中IO类扫盲篇
文章目录 一、简介二、字节流与字符流1. 字节流(InputStream、OutputStream)介绍与用法2. 字符流(Reader、Writer)介绍与用法 三、文件操作与目录遍历1. File类的基本使用2. 目录遍历与递归操作 四、序列化与反序列化1. 序列化与反…...

中秋国庆双节将至,企业如何进行软文推广?
节点营销是每个企业都会面临的课题,中秋国庆双节将至,这两个节日不仅是人们消费的高峰期,也是各大企业通过节日营销提高品牌知名度和美誉度的最佳时机,节点营销的方式之一就是软文推广,那么企业应该如何利用双节来进行…...

SpringMvc--CRUD
目录 一.什么是SpringMvc--CRUD 二.前期准备 公共页面跳转(专门用来处理页面跳转) 三.ssm之CRUD后端实现 配置pom.xml 双击mybatis-generator:generate自动生成mapper 编写generatorConfig.xml 项目结构 编写PagerAspect切面类 编写hpjyBiz接口类 编写hpjyBizImpl接…...
数据库去重(MYSQL和ORACLE)
一、数据库中的去重操作(删除数据库中重复记录的SQL语句)主要有三种方法 (1)、rowid方法 (2)、group by 方法 (3)、distinct方法 1、用rowid方法 根据Oracle带的rowid属性&#…...

微服务-kubernetes安装
文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性:2.2.2、传统部署方式:2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…...
stm32f103zet6移植标准库的sdio驱动
sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现,但一是文件结构有点复杂,二是相比于国内正点原子和野火的板子也有点不同,因此还是需要移植下才能使用。当然也可以直接使用正点原子或野火提供的实例,但为了熟…...

为什么vector容器的begin()既可以被iterator 也可以被const_iterator指向?
答:vector容器中的begin()是函数接口,它作为函数,被重载了。 typedef T* iterator; typedef const T* const_iterator; iterator begin();//括号中有隐含形参*this; const_iterator begin() const;//形参为…...

uniapp里textarea多行文本输入限制数量
uniapp里textarea多行文本域实现输入计数 <template><view class"inputs"><textarea class"text1" maxlength50 placeholder请输入... input"sumfontnum"></textarea><text class"text2">{{fontNum}}/…...

真香:Alibaba开源GitHub星标100K微服务架构全彩进阶手册
前言: 微服务架构作为一种高效灵活的应用架构,正在成为企业级应用开发的主流选择。在众多的微服务架构指南中,阿里巴巴开源的GitHub微服务架构全彩进阶手册备受瞩目,其100star更是证明了其在开发者社区中的重要地位。 这本手册汇…...

Mysql--事务
事务 开始之前,让我们先想一个场景,有的时候,为了完成某个工作,需要完成多种sql操作 比如转账 再比如下单 第一步 我的账户余额减少 第二步 商品的库存要减少 第三步 订单表中要新增一项 事务的本质,就是为了把多个操…...

【算法题】小红书2023秋招提前批算法真题解析
文章目录 题目来源T1:5900: 【DP】小红书2023秋招提前批-连续子数组最大和5801: 【二分查找】小红书2023秋招提前批-精华帖子解法1——排序滑动窗口解法2——前缀和 二分查找 5000: 【模拟】小红书2023秋招提前批-小红的数组构造解法——数学 5300: 【哈希表】小红…...

序列到序列学习(seq2seq)
permute(1,0,2),将batch_size 放在中间state 最后一个时刻,每个层的输出...

基于Java+SpringBoot+Vue摄影分享网站的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...