目录

事务

MySQL事务的四大特性

ACID

原子性

持久性

隔离性

事务的隔离级别

读未提交

读已提交

可重复读

串行化

事务的隔离级别如何实现

MVCC

版本链

READVIEW

高可用

MySQL数据库的读写分离

主从复制

主从同步延迟怎么处理

分库策略

水平分库分表的策略


事务

MySQL事务的四大特性

事务是一条或多条 SQL 语句组成的执行单元。四个特性分别是原子性、一致性、隔离性和持久性。原子性保证事务中的操作要么全部执行、要么全部失败;一致性保证数据从事务开始前的一个一致状态转移到结束后的另外一个一致状态;隔离性保证并发事务之间互不干扰;持久性保证事务提交后数据不会丢失。

ACID

就是事务的四大特性

原子性

ACID 中的原子性主要通过 Undo Log 来实现,持久性通过 Redo Log 来实现,隔离性由 MVCC 和锁机制来实现,一致性则由其他三大特性共同保证。

事务对数据进行修改前,会记录一份快照到 Undo Log,如果事务中有任何一步执行失败,系统会读取 Undo Log 将所有操作回滚,恢复到事务开始前的状态,从而保证事务要么全部成功,要么全部失败。

持久性

MySQL 的持久性主要由预写 Redo Log、双写机制、两阶段提交以及 Checkpoint 刷盘机制共同保证。

当事务提交时,MySQL 会先将事务的修改操作写入 Redo Log,并强制刷盘,然后再将内存中的数据页刷入磁盘。这样即使系统崩溃,重启后也能通过 Redo Log 重放恢复数据。

隔离性

主要通过锁机制和 MVCC 来实现。

比如说一个事务正在修改某条数据时,MySQL 会通过临键锁来防止其他事务同时进行修改,避免数据冲突

MySQL默认事务自动提交

事务的隔离级别

MySQL 支持四种隔离级别,分别是:读未提交、读已提交、可重复读和串行化。

读未提交

事务可以读取其他未提交事务修改的数据。也就是说,如果未提交的事务一旦回滚,读取到的数据就会变成了“脏数据”,通常不会使用。

读已提交

读已提交避免了脏读,但可能会出现不可重复读,即同一事务内多次读取同一数据结果会不同,因为其他事务提交的修改,对当前事务是可见的。

可重复读

可重复读能确保同一事务内多次读取相同数据的结果一致,即使其他事务已提交修改。

串行化

串行化是最高的隔离级别,通过强制事务串行执行来解决“幻读”问题。

事务的隔离级别如何实现

读未提交通过行锁共享锁确保一个事务在更新行数据但没有提交的情况下,其他事务不能更新该行数据,但不会阻止脏读,意味着事务2 可以在事务1 提交之前读取到事务1 修改的数据

读已提交会在更新数据前加行级排他锁,不允许其他事务写入或者读取未提交的数据,也就意味着事务2 不能在事务 1 提交之前读取到事务1 修改的数据,从而解决脏读的问题。

可重复读只在第一次读操作时生成 ReadView,后续读操作都会使用这个 ReadView,从而避免不可重复读的问题。

另外,对于当前读操作,可重复读会通过临键锁来锁住当前行和前间隙,防止其他事务在这个范围内插入数据,从而避免幻读的问题。

MVCC

多版本并发控制

每次修改数据时,都会生成一个新的版本,而不是直接在原有数据上进行修改。并且每个事务只能看到在它开始之前已经提交的数据版本。

其底层实现主要依赖于 Undo Log 和 Read View。

版本链

版本链是指 InnoDB 中同一条记录的多个历史版本,通过 DB_ROLL_PTR 字段将它们像链表一样串起来,用来支持 MVCC 的快照读。

READVIEW

ReadView 是 InnoDB 为每个事务创建的一份“可见性视图”,用于判断在执行快照读时,哪些数据版本是当前这个事务可以看到的,哪些不能看到。

高可用

MySQL数据库的读写分离

读写分离就是把“写操作”交给主库处理,“读操作”分给多个从库处理,从而提升系统并发性能。

应用层通过中间件(如 MyCat、ShardingSphere)自动路由请求,将 INSERT / UPDATE / DELETE 等写操作发送给主库,将 SELECT 查询操作发送给从库。

主从复制

MySQL 的主从复制是一种数据同步机制,用于将数据从主数据库复制到一个或多个从数据库。

主库执行事务提交时,将数据变更以事件形式记录到 Binlog。从库通过 I/O 线程从主库的 Binlog 中读取变更事件,并将这些事件写入到本地的中继日志文件中,SQL 线程会实时监控中继日志的内容,按顺序读取并执行这些事件,从而保证从库与主库数据一致。

主从同步延迟怎么处理

主从同步延迟是因为从库需要先接收 binlog,再执行 SQL 才能同步主库数据,在高并发写或网络抖动时容易出现延迟,导致读写不一致。

第一种解决方案:对一致性要求高的查询(如支付结果查询)可以直接走主库。

第二种解决方案:对于非关键业务允许短暂数据不一致,可以提示用户“数据同步中,请稍后刷新”,然后借助异步通知机制替代实时查询。

第三种解决方案:采用半同步复制,主库在事务提交时,要等至少一个从库确认收到 binlog(但不要求执行完成),才算提交成功。

分库策略

分库的策略有两种,第一种是垂直分库:按照业务模块将不同的表拆分到不同的库中,比如说用户、登录、权限等表放在用户库中,商品、分类、库存放在商品库中,优惠券、满减、秒杀放在活动库中。

第二种是水平分库:按照一定的策略将一个表中的数据拆分到多个库中,比如哈希分片和范围分片,对用户 id 进行取模运算或者范围划分,将数据分散到不同的库中。

水平分库分表的策略

常见的分片策略有三种,范围分片、Hash 分片和路由分片。

范围分片是根据某个字段的值范围进行水平拆分。适用于分片键具有连续性的场景

Hash 分片是指通过对分片键的值进行哈希取模,将数据均匀分布到多个库表中,适用于分片键具有离散性的场景。

路由分片是通过路由配置来确定数据应该存储在哪个库表,适用于分片键不规律的场景。

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

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

相关文章

借助AI学习开源代码git0.7之六write-tree

借助AI学习开源代码git0.7之六write-tree write-tree.c 的作用是根据当前的索引(cache)内容创建一个树(tree)对象,并将其写入Git的对象数据库。 树对象代表了项目在某个时间点的目录结构。 代码的主要逻辑:…

开源 python 应用 开发(八)图片比对

最近有个项目需要做视觉自动化处理的工具,最后选用的软件为python,刚好这个机会进行系统学习。短时间学习,需要快速开发,所以记录要点步骤,防止忘记。 链接: 开源 python 应用 开发(一&#xf…

SeaTunnel 云仓连接器使用指南 | AI 助手解读系列

最近体验了一下 Deepwiki 的 AI 文档生成功能,本文展示其自动生成的《SeaTunnel 云端数据仓库连接器》文档内容,欢迎大家一起“挑刺捉虫”,看看 AI 写技术文档到底靠不靠谱? 本文档介绍了 Apache SeaTunnel 的云数据仓库连接器&a…

每日算法刷题Day51:7.21:leetcode 栈6道题,用时1h40min

二.进阶 1.套路 2.题目描述 1.给你一个字符串 s 。它可能包含任意数量的 * 字符。你的任务是删除所有的 * 字符。 当字符串还存在至少一个 * 字符时,你可以执行以下操作: 删除最左边的 * 字符,同时删除该星号字符左边一个字典序 最小的字…

网络基础DAY16-MSTP-VRRP

STP/RSTP的局限性1.所有VLAN共享一棵生成树 2.无法实现不同VLAN在多条Trunk链路上的负载分担 3.次优化二层路径。MSTP的基本概念及优势MSTP的定义MST域拥有相同MST配置标识的网桥构成的集合。 具体如何分辨是否是同一个域,就看域名,配置修订号&#xff0…

freertos关键函数理解 uxListRemove

//删除pxItemToRemove节点 UBaseType_t uxListRemove(ListItem_t *pxItemToRemove) { //The list item knows which list it is in. Obtain the list from the list item.//找到节点所在的链表//my_printf( "uxListRemove pxItemToRemove %#p\n", pxI…

C语言---番外篇(柔性数组)

前言: 由于这块内容所谓综合性比较高,有数组的知识,有结构体的知识,还有动态内存管理的知识,所以我就单独写一篇博客,此谓番外篇。 柔性数组的概念 定义在结构体的最后一个元素的位置且大小未知的数组就叫…

单片机的几种GPIO输入输出模型详解

模式选择汇总参考表:模式输出驱动输入阻抗默认状态典型应用场景推挽输出强驱动禁用可配置LED, SPI, 高速信号开漏输出弱驱动禁用低/悬空IC, 电平转换, 线与浮空输入禁用极高不确定外部强驱动信号上拉输入禁用中高高电平按键(接地型), 数字输入下拉输入禁用中高低电平…

深度解析ECharts.js:构建现代化数据可视化的利器

引言:数据可视化的新时代挑战 在数字化转型浪潮中,数据可视化已成为企业决策和用户体验的关键环节。面对海量数据的呈现需求,传统表格已无法满足用户对直观洞察的渴求。作为百度开源的JavaScript可视化库,ECharts.js凭借其强大的功…

从零构建实时通信引擎:Freeswitch源码编译与深度优化指南

一、构建工具:编译FreeSWITCH及其依赖库的基础 1. CMake2. Autoconf 二、汇编器:提升音视频处理性能 3. YASM / NASM 三、音视频编解码器:支撑实时媒体传输 4. Opus5. x264 (可选)6. libvpx / libvpx2 (可选) 四、多媒体框架与工具库&#xf…

网络原理 HTTP 和 HTTPS

目录 一 . HTTP 协议 二 . 抓包 三 . HTTP 请求 / 响应的基本格式 (1)HTTP请求的基本格式 (2)HTTP响应的基本格式 四 . HTTP 方法 GET 和 POST 的区别: 五 . 请求报头和响应报头 (1&#…

基于单片机的自动条幅悬挂机

摘 要 随着日新月异科技发展,在心率体温测量方面,我们取得了迅速的发展,就近日而言,脉搏测量仪已经在多个领域大展身手,除了在医学领域有所建树,在人们的日常生活方面的应用也不断拓展,如检疫…

《C++》面向对象编程--类(中)

文章目录一、构造函数1.1定义1.2语法1.3特性二、析构函数2.1定义2.2语法2.3特性三、拷贝构造函数3.1定义3.2语法3.3特性3.4浅拷贝3.4.1定义3.4.2浅拷贝的风险3.5深拷贝一、构造函数 1.1定义 在C中,构造函数(Constructor) 是一种特殊的成员函…

机器学习初学者理论初解

大家好! 为什么手机相册能自动识别人脸?为什么购物网站总能推荐你喜欢的商品?这些“智能”背后,都藏着一位隐形高手——机器学习(Machine Learning)。一、什么是机器学习?简单说,机器学习是教计…

原码反码补码

在Java中,无论是小数还是整数,他们都要带有符号(和C语言不同,C语言有无符号数)。首位就作为符号位。原码反码:正数的反码是其原码本身负数的反码是在其原码的基础上, 符号位不变,其余各个位取反…

使用ubuntu:20.04和ubuntu:jammy构建secretflow环境

一、使用ubuntu:20.04构建隐语编译环境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(铰链损失函数)详解:SVM 中的关键损失函数

📌 一、什么是 Hinge Loss?Hinge Loss(铰链损失),是 支持向量机(SVM, Support Vector Machine) 中常用的一种损失函数,用于最大间隔分类。其核心思想是:当预测结果已经正…

days32 :零基础学嵌入式之网络2.0

一、wireshark :网络抓包工具1.功能:抓取通过电脑网卡的网络数据2.作用:排查故障、抓取数据做数据分析、3.用法:(1)sudo wireshark(2)选择需要抓取的网卡》any(3&#xf…

数字护网:一次深刻的企业安全体系灵魂演练

🧩 引言:什么是“护网”?—— 不止是攻防,更是企业安全能力的年度大考 每年,由国家相关部门牵头的“护网行动”都如期而至,各大企事业单位的安全团队也随之进入高度戒备状态。然而,“护网”远非…

基于 NumPy 的高效数值计算技术解析与实践指引

在数据处理与科学计算领域,高效是核心诉求。NumPy 作为 Python 生态高效数值计算的基石,以高性能多维数组对象及配套函数,成为数据从业者的必备工具。其数组支持算术、比较、逻辑等丰富运算,通过向量化操作直接处理每个元素&#…