数据库事务问题整理-MySQL
什么是数据库事务?
数据库事务( transaction)是访问并可能操作(增删改查都可能有)各种数据项的一个数据库操作序列(可能有1或多个SQL语句),这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
为什么有事务?
数据库的事务(Transaction)设计主要是为了解决在并发访问和数据修改时可能出现的一系列问题,这些问题包括:
1. 原子性问题(Atomicity):确保事务中的所有操作要么全部成功执行,要么全部不执行。如果事务中的任何部分失败,则整个事务需要回滚到执行前的状态,保证数据不会处于中间状态。
2. 一致性问题(Consistency):事务完成后,数据库必须从一个一致性的状态转变为另一个一致性的状态。这意味着事务应当遵循所有的业务规则和完整性约束,即使在并发操作中也是如此。
3. 隔离性问题(Isolation):多个事务并发执行时,它们之间应该是独立且互不影响的。为了达到这一目标,数据库系统定义了事务的隔离级别:读未提交,读已提交,可重复读、串行化等,以避免以下并发问题:
1)脏读(Dirty Read):一个事务读取到了另一个未提交事务更改的数据。
2)不可重复读(Non-repeatable Read):在一个事务内,同一查询在同一时间点前后获得的结果不同,因为其间有其他事务对数据进行了修改并提交。
3)幻读(Phantom Read):在一个事务内,同样的查询在两次执行间返回了不同的结果集,因为在两次查询间又有新的行被其他事务插入或删除。
4) 持久性问题(Durability):一旦事务完成并且被提交,其影响应永久保存在数据库中,即使发生系统崩溃或者电源故障,通过日志恢复机制也能确保事务的持久化。
所以引入事务的概念和对应的ACID机制,保证了数据库能够有效管理并发控制,保证了数据的完整性和一致性,保证了数据在复杂情况下可靠性。
MySQL innodb引擎如何保证事务的ACID?
1.原子性 (Atomicity):
事务中的所有操作被视为一个不可分割的单元,要么全部成功,要么全部失败。当事务提交时,InnoDB 会使用一种称为“回滚段”(rollback segments) 的数据结构来记录每个修改前的数据版本,即 Undo Log。如果事务在执行过程中发生错误或被用户手动回滚,InnoDB 就可以利用这些undo log将数据库状态恢复到事务开始之前。
2.一致性 (Consistency):
MySQL 中的一致性是通过约束(如唯一键、外键和检查约束)以及事务逻辑保证的。当事务完成时,无论中间状态如何,最终结果都必须满足所有的完整性约束。
3.隔离性 (Isolation):
在 InnoDB 中,通过 MVCC(多版本并发控制)和 锁机制 实现不同的隔离级别:
Read View:在可重复读隔离级别下,事务看到的是在一个特定时间点创建的快照,这样就避免了脏读和不可重复读的问题。
Locking:InnoDB 使用行级锁定来处理写操作,以防止并发事务间的冲突,从而解决幻读问题。
4.持久性 (Durability):
持久性的保证主要是通过预写日志(WriteAhead Logging, WAL)技术来实现的,主要包括 Redo Log(重做日志):
Redo Log:事务在对数据库进行更改之前,先将改动内容记录在 redo log buffer 中,然后定期将其刷入磁盘上的 redo log 文件中。即使在系统崩溃的情况下,MySQL 在重启时可以通过重放 redo log 中的内容来恢复尚未写入数据文件的已提交事务,确保事务的持久性。
MVCC机制中如何处理读已提交和可重复读?
MySQL innodb存储引擎中,针对读已提交和可重复读:
读已提交(Read Committed):
每次执行简单的SELECT查询时都会获取最新的已经提交的数据版本,也就是说,对于同一个事务内的多次SELECT操作,可能会基于不同的时间点创建多个快照。因此,在同一事务内,如果其他事务提交了更改,则后续的SELECT语句可能看到不同的数据结果。
可重复读(Repeatable Read):
在事务开始时创建一个一致性视图(即快照),这个视图在整个事务期间保持不变。这样,在事务内部执行的所有非锁定的简单SELECT查询都将会根据该事务开始时创建的一致性视图来读取数据,确保在同一事务内的多次相同查询始终返回相同的结果,即使在此期间有其他事务对这些数据进行了更新并提交。
而对于当前读操作(如UPDATE, DELETE, SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE等),无论在读已提交还是可重复读隔离级别下,它们总是会获得当前最新的数据,并且会对涉及的数据行加锁(Next-Key Locks(行锁+间隙锁)),以保证事务能够看到并控制其他事务对这些数据的操作。
以上是我对数据库事务一些问题的重新思考。当我从“事务是什么”、“为什么有事务”、“事务为数据库解决了什么问题”等多个角度审视“事务”时,我变的更加能主动思考事务的本质,并能提出问题和获取经验,
相关文章:
数据库事务问题整理-MySQL
什么是数据库事务? 数据库事务( transaction)是访问并可能操作(增删改查都可能有)各种数据项的一个数据库操作序列(可能有1或多个SQL语句),这些操作要么全部执行,要么全部不执行,是一个不可分割…...
工具函数模板题(蓝桥杯 C++ 代码 注解)
目录 一、Vector容器: 二、Queue队列 三、Map映射 四、题目(快递分拣 vector): 代码: 五、题目(CLZ银行问题 queue): 代码: 六、题目(费里的语言 map&…...
Ansible playbook 简介 使用场景
Ansible playbook 简介 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。 通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系…...
TS总结10、ts的 class 类型(配置项strictPropertyInitialization、非空断言)
一、简介 1.类(class)是面向对象编程的基本构件,封装了属性和方法 1.1、属性的类型:类的属性可以在顶层声明,也可以在构造方法内部声明,如果不给出类型;TypeScript 会认为x和y的类型都是any&a…...
leetcode 热题 100_找到字符串中所有字母异位词
题解一: 滑动窗口:类似于字符串匹配,但匹配异位词需要包含相同的字母及个数,可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数,再用Array.equals()进行比对。对于s.length()<p.length()的情况需要特判。…...
百度百科数据爬取 python 词条数据获取
最近需要补充一些电力名词的解释,尤其是文字相关内容。百度百科上的词条质量有差异,因此我们需要先手工选择一些高质量词条。 假设我们选择了互感器页面中的仪用变压器词条,首先: import requests from bs4 import BeautifulS…...
为不同文章形式选择不同的WordPress文章模板
在写文章的时候选择不同的文章形式,然后打开文章的时候会调用不同文章形式的模板。比如,文章形式为video ,就调用single-video.php模板,其它文章形式类似,可以添加多个文章样式。 //为不同文章形式的内容添加不同的si…...
MySQL存储引擎及索引机制
大家好我是咕噜美乐蒂,很高兴又和大家见面了! MySQL 存储引擎是指 MySQL 数据库管理系统中负责存储和检索数据的组件,它们可以影响数据的存储方式、事务支持、并发性能等方面。而索引则是用于加速检索数据库表中数据的数据结构。下面我将分别…...
Leetcode算法题
二进制求和 给两个字符串a和b,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” 输出:“10101” 提示: 1 <…...
数据结构之七大排序
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...
【MySQL】数据库中常用的函数
目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数:获取参数值的字节个数concat(str1,str2,...)函数:字符串拼接upper(str)、lower(str)函数:大小…...
嵌入式面试常见问题(四)
1.在基于Linux的网络套接字编程中,如果需要创建一个IPv4的网络套接字,应该在socket函数中指定domain参数为AF_INET 解析: socket()函数创建套接字 函数原型:int socket(int domain, int type, int protocol); domain:协议簇&…...
用Java在Spring Boot项目中,如何传递来传递一个对象(多个参数??
前言: 在前面我们已经了解到,Spring Boot项目中,可以传递一个参数,或者多个参数,但是,随着参数的增加,咱们总不能每增加一个参数,就重新写一段代码吧??这样显…...
如何利用ChatGPT搞科研?论文检索、写作、基金润色、数据分析、科研绘图(全球地图、植被图、箱型图、雷达图、玫瑰图、气泡图、森林图等)
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
一命通关二分搜索
二分法 简介 和双指针一样,二分法也是一种优化方法,或者说二分法就是双指针的一类。不过,二分法的思想比双指针诞生更早也更广泛,在我们日常生活里也无时不刻在使用二分的思想。 比如我们想回顾某些影片,但是只记得…...
串联所有单词的子串
题目链接 串联所有单词的子串 题目描述 注意点 words[i] 和 s 由小写英文字母组成1 < words.length < 5000可以以 任意顺序 返回答案words中所有字符串长度相同 解答思路 根据滑动窗口哈希表解决本题,哈希表存储words中所有的单词及单词的出现次数&#…...
【会议征稿通知】第四届经济发展与商业文化国际学术会议(ICEDBC2024)
第四届经济发展与商业文化国际学术会议(ICEDBC2024) The 4th International Conference on Economic Development and Business Culture (ICEDBC 2024) 第四届经济发展与商业文化国际学术会议(ICEDBC2024)将于2024年6月21-23日在…...
回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】
46 . 全排列 链接 : . - 力扣(LeetCode) 思路 : 那么怎么确定选了那个数呢? 这里设置一个used表示i选没选过 ; class Solution { public:vector<vector<int>> ans;vector<int> path;void backtrack(vector<int>nums,vect…...
MyBatis-Plus 框架中的自定义元对象处理器
目录 一、代码展示二、代码解读 一、代码展示 package com.minster.yanapi.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component;import java.util…...
Node.js_基础知识(fs模块 - 文件操作)
写入 文件操作 流式写入:fs.createWriteStream(path[, options]) 可以减少打开关闭文件的次数适用于:大文件写入、频繁写入参数说明: path:文件路径文件夹操作: 调用mkdir方法:fs.mkdir(./a/b/c, err => {}) 递归创建文件夹:加参数recursive fs.mkdir(./a/b/c, {recu…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
