安全基础 --- MySQL数据库解析
MySQL的ACID
(1)ACID是衡量事务的四个特性
- 原子性(Atomicity,或称不可分割性)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
(2)解析
原子性:语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是用原子性来定义的。(实现主要基于 undo log)
持久性:保证事务提交后不会因宕机导致数据丢失。(实现主要基于 redo log)
隔离性:保证事务执行尽可能不受其他事务影响;InooDB默认的隔离级别是RR,RR的实现主要基于锁机制(包含next-key lock)、MVCC(包括数据的隐藏列、基于 undo log 的版本链、ReadView)
一致性:事务追求的最终目标,一致性的实现既需要数据库层面的保障,也需要应用层面的保障
mysql的锁机制
加锁机制:乐观锁和悲观锁
(1)悲观锁
悲观锁:又称悲观并发控制,指的是数据被外界修改持保持态度,整个事务处理中,将数据进行锁定,直到事务处理完毕,才释放锁。
PS:悲观锁认为并发事物会导致问题,屏蔽一切可能违反数据一致性的操作。
特点:完全保证数据的独占性和正确性,因为每次请求都会先对数据进行加锁,然后进行数据操作,最后再解锁,加锁释放锁的过程会有消耗,所以性能不高;
(2)乐观锁
乐观锁:假设认为数据一般情况下不会造成冲突,所以在数据提交更新时候,才回正式对数据的冲突与否进行检查。
实现方式(常见):
- 版本号:表中新增一个版本号字段,每次数据更新都会修改版本号。更新数据会检查数据库中版本号与之前读取版本号是否一致,一致则允许修改
- 时间戳:类似于版本号的方式,使用数据库时间戳来实现。更新数据时会检查时间戳是否与之前读取的一致
- 基于字段判断:使用WHERE字句加上之前读取的字段值进行判断。更新行数为0,则表示数据已被其他事务修改,发生冲突
在提交更新之前检查是否有其他事务已经修改了该记录,如果发现修改,则会回滚更新并重试事务。否则,它会将更新提交到数据库。
兼容性:共享锁和排它锁
(1)排它锁
排它锁:又被称为写锁(简称X锁)。不能与其它事务共存,如一个事务获取了一个数据行的排它锁,其他事务就不能获取该行的其他锁,包括共享锁和排它锁。
实质:排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁
实现:
打开第一个命令行界面
set autocommit=0; ---> 关闭自动提交
select * from users where from id=1 for update; ---> 查询语句的同时增加排它锁
打开第二个命令行界面
进程阻塞,不会再去动这个进程,除非上级事务提交
上级事务已提交
查询结果显示
存在问题:用户的体验和性能。如果用排它锁锁住,所有的读、请求都会堵塞在这里,对系统压力较大。n等多个进程全部堵塞,在等待中,释放后这些进程就会开始竞争,其中一个进程竞争到,其他进程相当于什么都没干,系统性能已消耗。 --- 惊群效应
惊群效应:当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。
(2)共享锁
共享锁:又被称为读锁(简称S锁)。多个事务对于同一数据可以共享一把锁,都能访问到数据,但是仅只读不能修改。
共享锁相对更好理解一点,就是多个事务只能读数据不能改数据。
实现:
打开第一个命令界面
select * from users where id=1 lock in share mode; ---> 做共享锁
打开第二个命令界面
update users set username='oupeng' where id=1; ---> 更新users表中id=1的username
存在问题:修改数据时,该共享锁认为该线程一定会被一定会被多个线程争抢,读线程不受影响,
PS:共享锁和排它锁都属于悲观锁
mysql事务隔离级别
MySQL 事务都是指在 InnoDB 引擎下
(1)级别分类
mysql有四个事务隔离级别,每个级别都有字符或数字编号
- 读未提交(READ-UNCOMMITTED)| 0 :存在脏读,不可重复读,幻读的问题
- 读已提交(READ-COMMITTED) | 1:解决脏读的问题,存在不可重复读,幻读的问题
- 可重复读(REPEATABLE-READ) | 2:解决脏读,不可重复读的问题,存在幻读的问题,默认隔离级别,使用MVVC机制,实现可重复读
- 序列化(SERIALIZABLE) | 3:解决脏读,不可重复读,幻读的问题,保证事务安全,但完全串行执行,性能最低
查看会话的事务隔离级别:
select @@global.tx_isolation, @@tx_isolation;
默认的隔离级别为可重复读
(2)解决实际问题
- 脏读(Dirty Read)
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。 - 可重复读(Repeatable Read)
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作。 - 不可重复读(Non-Repeatable Read)
对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。 - 幻读(Phantom Read)
幻读多是针对数据插入(INSERT)操作来说的。事务 A 按照一定条件进行数据读取, 期间事务 B 插入了相同搜索条件的新数据,事务 A 再次按照原先条件进行读取时,发现了事务 B 新插入的数据,称为幻读
脏读演示
<1> 开启A,B两个窗口,进行如下操作:
show variables like 'autocommit'; ---- 查看当前的自动提交是否开启
set autocommit = off; --- 关闭自动提交
set session transaction isolation level read uncommitted; --> 设置当前会话隔离级别为“读未提交”
select @@tx_isolation; --> 查看当前隔离级别
start transcation; --- 开启事务,(begin; -- 显式开启事务)
<2> 修改数据进行查询
B:update users set username='123456' where id=1; --- 修改id=1的username为123456
A:select * from users where id=1; --- 在A窗口查询id=1的数据
事务未关闭,显示数据已被更改,此时出现的问题即为脏读。
不可重复读演示
<1> 关闭A,B的自动提交机制,使用读已提交隔离级别,开启事务
<2> 修改数据进行查询
B:update users set username='oupengaaa' where id=1; --- 修改id=1的username为oupengaaa
A:select * from users where id=1; --- 在A窗口查询id=1的数据
id=1的username未发生改变,当B窗口修改事务后未使用(commit;)提交,所以事务未发生改变。
在B窗口提交后,在A窗口进行查询
存在问题:不可重复读 --- 同一事物内,最开始读到的数据和事务结束前任意时刻读到的数据不一致。
可重复读演示
<1> 关闭A,B的自动提交机制,使用可重复读隔离级别,开启事务
<2> 修改数据进行查询
B:update users set username='oupeng1234' where id=1; --- 修改id=1的username为oupeng1234
A:select * from users where id=1; --- 在A窗口查询id=1的数据
id=1的username未发生改变
B窗口提交后继续查看,依旧未改变
A窗口使用(commit;)提交,查询数据改变情况
存在问题:可重复读可能产生幻读问题,幻读问题很少出现。
可重复读的实现机制:MVCC --- 多版本并发控制,类似于乐观锁的实现机制
多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。
幻读演示(可重复读环境下)
事务T1:
事务T2:
只要 T1 和 T2 时刻执行产生的结果集是不相同的,那就发生了幻读的问题,比如:
-
T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。
-
T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。
由此,可把幻读理解为:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
(3)mysql 幻读问题
MVCC + gap Lock
幻读是指在一个事务中,由于其他事务的并发操作,导致同一个查询在不同时间点返回不同的结果集。简单来说,幻读就是一个事务在读取数据的过程中,发现了一些“幻影”数据,这些数据在事务开始时不存在,但在事务结束时却突然出现了。
两种解决方案:
<1> 针对快照读(普通select语句):通过 MVCC 方式解决了幻读。MVCC 是一种在并发事务执行过程中管理数据版本的机制。它通过为每个事务分配唯一的事务 ID 和版本号来跟踪数据的变化。
<2> 针对当前读(select ... for update 等语句):是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。
相关文章:
安全基础 --- MySQL数据库解析
MySQL的ACID (1)ACID是衡量事务的四个特性 原子性(Atomicity,或称不可分割性)一致性(Consistency)隔离性(Isolation)持久性(Durability) &…...
软件设计师考试学习3
开发模型 瀑布模型 现在基本被淘汰了 是一种结构化方法中的模型,一般用于结构化开发 问题在于需求阶段需求不可能一次搞清楚,很可能做完推翻重做 适用于需求明确或二次开发 原型模型、演化模型、增量模型 原型是为了解决需求不明确的问题 原型在项目…...
使用LDA(线性判别公式)进行iris鸢尾花的分类
线性判别分析((Linear Discriminant Analysis ,简称 LDA)是一种经典的线性学习方法,在二分类问题上因为最早由 [Fisher,1936] 提出,亦称 ”Fisher 判别分析“。并且LDA也是一种监督学习的降维技术,也就是说它的数据集的每个样本都…...
王学岗生成泛型的简易Builder
github大佬地址 使用 //class 可以传参DataBean.classpublic static <T> T handlerJson(String json, Class<T> tClass) {T resultData null;if (CommonUtils.StringNotNull(json) && !nullString.equals(json)) {if (isArray(json)) {resultData BaseN…...
kafka消息队列简单使用
下面是使用Spring Boot和Kafka实现消息队列的简单例子: 引入依赖 在pom.xml中添加以下依赖: <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.7.5&l…...
性能优化实战使用CountDownLatch
1.分析问题 原程序是分页查询EventAffinityScoreDO表的数据,每次获取2000条在一个个遍历去更新EventAffinityScoreDO表的数据。但是这样耗时比较慢,测试过30万的数据需要2小时 private void eventSubjectHandle(String tenantId, String eventSubject) …...
基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案
一、方案背景 近年来,随着居民体育运动意识的增强,体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时,可能发生受伤意外,甚至牵扯责任赔偿纠纷问题。同时,物品丢失、人力巡逻成本问题突出,体育场…...
leetcodetop100(29) K 个一组翻转链表
K 个一组翻转链表 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…...
最新影视视频微信小程序源码-带支付和采集功能/微信小程序影视源码PHP(更新)
源码简介: 这个影视视频微信小程序源码,新更新的,它还带支付和采集功能,作为微信小程序影视源码,它可以为用户 提供丰富的影视资源,包括电影、电视剧、综艺节目等。 这个小程序影视源码,还带有…...
C++:vector 定义,用法,作用,注意点
C 中的 vector 是标准模板库(STL)提供的一种动态数组容器,它提供了一组强大的方法来管理和操作可变大小的数组。以下是关于 vector 的定义、用法、作用以及一些注意点: 定义: 要使用 vector,首先需要包含 …...
Firecamp2.7.1exe安装与工具调试向后端发送SocketIO请求
背景: 笔者在python使用socket-io包时需要一个测试工具,选择了firecamp这个测试工具来发送请求。 参考视频与exe资源包: Firecamp2.7.1exe安装包以及基本使用说明文档(以SocketIO为例).zip资源-CSDN文库 15_send方法…...
MySQL到TiDB:Hive Metastore横向扩展之路
作者:vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程,由实际面临的问题出发,对当前主流的横向扩展方案进行了调研及对比测试,通过多方面对比数据择优选择TiDB方案。其次分享了整…...
算法通关村-----寻找祖先问题
最近公共祖先 问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…...
Sentinel结合Nacos实现配置持久化(全面)
1、前言 我们在进行分布式系统的开发中,无论是在开发环境还是发布环境,配置一定不能是内存形式的,因为系统可能会在中途宕机或者重启,所以如果放在内存中,那么配置在服务停到就是就会消失,那么此时就需要重…...
Verilog中什么是断言?
断言就是在我们的程序中插入一句代码,这句代码只有仿真的时候才会生效,这段代码的作用是帮助我们判断某个条件是否满足(例如某个数据是否超出了范围),如果条件不满足(数据超出了范围)࿰…...
Oracle分区的使用详解:创建、修改和删除分区,处理分区已满或不存在的插入数据,以及分区历史数据与近期数据的操作指南
一、前言 什么是表分区: Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。 表分区和表空间的区别和联系: 在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对…...
SLAM从入门到精通(amcl定位使用)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习slam,一般就是所谓的边定位、边制图的知识。然而在实际生产过程中,比如扫地机器人、agv、巡检机器人、农业机器人&…...
【C/C++】C/C++面试八股
C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的?构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么?为什么要内存对齐static关键…...
Scala第八章节
Scala第八章节 scala总目录 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式能够独立叙述trait的构造机制能够了解trait继承class的写法能够独立完成程序员案例 1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情…...
k8s-实战——kubeadm二进制编译
文章目录 源码编译获取源码修改证书有效期修改 CA 有效期为 100 年(默认为 10 年)修改证书有效期为 100 年(默认为 1 年)CentOS7.9环境准备centos脚本安装执行脚本脚本内容手动安装验证编译查看编译后的版本信息参考链接脚本修改源码编译 源码编译kubeadm文件、修改证书的默…...
vite 和 webpack 的区别
1. 构建原理: Webpack 是一个静态模块打包器,通过对项目中的JavaScript、css、Image 等文件进行分析,生成对应的静态资源,并且通过一些插件和加载器来实现各种功能。 Vite 是一种基于浏览器元素 ES 模块解析构建工具,…...
传统遗产与技术相遇,古彝文的数字化与保护
古彝文是中国彝族的传统文字,具有悠久的历史和文化价值。然而,由于古彝文的形状复杂且没有标准化的字符集,对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术,旨在提高古彝文的自动识别准确性…...
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制) 目录 多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述…...
1042 字符统计
description 请编写程序,找出一段给定文字中出现最频繁的那个英文字母。 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束ÿ…...
3 OpenCV两张图片实现稀疏点云的生成
前文: 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…...
在Springboot项目中使用Redis提供给Lua的脚本
在Springboot项目中使用Redis提供给Lua的脚本 在Spring Boot项目中,你可以使用RedisTemplate来执行Lua脚本。RedisTemplate是Spring Data Redis提供的一个Redis客户端,它可以方便地与Redis进行交互。以下是使用RedisTemplate执行Lua脚本的一般步骤&…...
分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测
分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…...
Linux或Centos查看CPU和内存占用情况_top只能查看对应的命令_如何查看具体进程---linux工作笔记062
一般我们都是用top去查看,但是top查看的结果,不能看出,具体是哪个程序占用的,这就很苦恼.. 其实如果有时间的话,再去专门看一下网络安全和linux脚本以及命令方面的,比较系统的看一下比较好.现在积累的都是工作中用到的,比较零散的知识. 如果用top,比如说这里的java,就只能知道…...
什么是DevOps
文章目录 一、概念二、地位三、目标四、要求五、具体手段 一、概念 是一组过程、方法与系统的统称,有助于打破开发、测试、运维、交付部门之间的壁垒,提高部门间的沟通协助能力。 二、地位 应成为公司的一种理念、文化、哲学。 三、目标 实现更加高…...
力扣每日一题
605. 种花问题 - 力扣(LeetCode) 动态规划 class Solution { public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int m flowerbed.size();if(1 m)return !flowerbed[0] > n;else if(2 m)return ((!flowerbed[0] &&…...
企业网站的制作成本/国际新闻今天
大家好,我是 " 网游品味领导者 "X 博士。最近腾讯的回合制新游《灵山奇缘》开启内测。腾讯过往比较少涉足回合制端游这块市场,这次的《灵山奇缘》从推广阵势来看似乎是一款腾讯力捧的大作。那么《灵山奇缘》的素质究竟如何呢?和以往…...
专门做儿童的店铺网站/制作一个小型网站
Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互…...
wordpress自然志/2021全国大学生营销大赛
Windows Phone 7上的异步编程模型其实也就是说把C#里面的异步编程模型在Windows Phone 7应用开发上使用。下面来看一下异步编程模型里面的一些关键的概念。 2个方法和一个委托和一个接口: (1)BeginInvoke方法用于启动异步调用 Begin 方法包含同步方法签名中的任何参…...
怎么用ps做网站banner/百度邮箱注册入口
PHP计算当前时间之后(之前)的时间PHP中有一个非常厉害的函数,strtotime()函数,这个函数有一个异常厉害的使用方法,手册上说的有,但是估计在实际应用中能够想到的人不多。我为了计算出当前时间N天后的日期时,也是自己写…...
恋爱ppt模板免费下载网站/seo网站优化外包
http://www.cnblogs.com/sfger/p/3335672.html 原因是安装在有空格的目录下会出现以下错误: 经过头疼的排查后发现问题出现在:set diffexprMyDiff() 原来vim的自带的MyDiff函数有问题, 在_vimrc或.vimrc中找到下面代码: if &am…...
为什么网站上传都上传不成功/找小网站的关键词
QString转化为char*问题零、小序一、方法零、小序 今天遇到一个很奇怪的问题,程序运行要生成中间结果,并以xml文件的形式保存起来。但是打包起来之后,死活就是生成不了xml文件。调试代码时发现又没有什么问题,中间结果可以生成。…...