当前位置: 首页 > news >正文

数据库事务问题整理-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_找到字符串中所有字母异位词

题解一&#xff1a; 滑动窗口&#xff1a;类似于字符串匹配&#xff0c;但匹配异位词需要包含相同的字母及个数&#xff0c;可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数&#xff0c;再用Array.equals()进行比对。对于s.length()<p.length()的情况需要特判。…...

百度百科数据爬取 python 词条数据获取

最近需要补充一些电力名词的解释&#xff0c;尤其是文字相关内容。百度百科上的词条质量有差异&#xff0c;因此我们需要先手工选择一些高质量词条。 假设我们选择了互感器页面中的仪用变压器词条&#xff0c;首先&#xff1a; import requests from bs4 import BeautifulS…...

为不同文章形式选择不同的WordPress文章模板

在写文章的时候选择不同的文章形式&#xff0c;然后打开文章的时候会调用不同文章形式的模板。比如&#xff0c;文章形式为video &#xff0c;就调用single-video.php模板&#xff0c;其它文章形式类似&#xff0c;可以添加多个文章样式。 //为不同文章形式的内容添加不同的si…...

MySQL存储引擎及索引机制

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01; MySQL 存储引擎是指 MySQL 数据库管理系统中负责存储和检索数据的组件&#xff0c;它们可以影响数据的存储方式、事务支持、并发性能等方面。而索引则是用于加速检索数据库表中数据的数据结构。下面我将分别…...

Leetcode算法题

二进制求和 给两个字符串a和b&#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 提示&#xff1a; 1 <…...

数据结构之七大排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…...

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…...

嵌入式面试常见问题(四)

1.在基于Linux的网络套接字编程中&#xff0c;如果需要创建一个IPv4的网络套接字&#xff0c;应该在socket函数中指定domain参数为AF_INET 解析&#xff1a; socket()函数创建套接字 函数原型:int socket(int domain, int type, int protocol); domain&#xff1a;协议簇&…...

用Java在Spring Boot项目中,如何传递来传递一个对象(多个参数??

前言&#xff1a; 在前面我们已经了解到&#xff0c;Spring Boot项目中&#xff0c;可以传递一个参数&#xff0c;或者多个参数&#xff0c;但是&#xff0c;随着参数的增加&#xff0c;咱们总不能每增加一个参数&#xff0c;就重新写一段代码吧&#xff1f;&#xff1f;这样显…...

如何利用ChatGPT搞科研?论文检索、写作、基金润色、数据分析、科研绘图(全球地图、植被图、箱型图、雷达图、玫瑰图、气泡图、森林图等)

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

一命通关二分搜索

二分法 简介 和双指针一样&#xff0c;二分法也是一种优化方法&#xff0c;或者说二分法就是双指针的一类。不过&#xff0c;二分法的思想比双指针诞生更早也更广泛&#xff0c;在我们日常生活里也无时不刻在使用二分的思想。 比如我们想回顾某些影片&#xff0c;但是只记得…...

串联所有单词的子串

题目链接 串联所有单词的子串 题目描述 注意点 words[i] 和 s 由小写英文字母组成1 < words.length < 5000可以以 任意顺序 返回答案words中所有字符串长度相同 解答思路 根据滑动窗口哈希表解决本题&#xff0c;哈希表存储words中所有的单词及单词的出现次数&#…...

【会议征稿通知】第四届经济发展与商业文化国际学术会议(ICEDBC2024)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09; The 4th International Conference on Economic Development and Business Culture (ICEDBC 2024) 第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在…...

回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】

46 . 全排列 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 那么怎么确定选了那个数呢? 这里设置一个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…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...