数据库事务问题整理-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(行锁+间隙锁)),以保证事务能够看到并控制其他事务对这些数据的操作。

      以上是我对数据库事务一些问题的重新思考。当我从“事务是什么”、“为什么有事务”、“事务为数据库解决了什么问题”等多个角度审视“事务”时,我变的更加能主动思考事务的本质,并能提出问题和获取经验,

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

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

相关文章

C++初阶:模版相关知识的进阶内容(非类型模板参数、类模板的特化、模板的分离编译)

结束了常用容器的介绍,今天继续模版内容的讲解: 文章目录 1.非类型模版参数2.模板的特化2.1模版特化引入和概念2.2函数模版特化2.3类模板特化2.3.1全特化2.3.1偏特化 3. 模板分离编译3.1分离编译概念3.2**模板的分离编译**分析原因 1.非类型模版参数 模板…

设计模式(五)-观察者模式

前言 实际业务开发过程中,业务逻辑可能非常复杂,核心业务 N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成&…

如何在Linux系统Docker部署Wiki.js容器并结合内网穿透实现远程访问本地知识库

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上,我们都需要通过某种方式来有条理的组织相应的知识架构,那么一个好的知识整…

适用Java SpringBoot项目的分布式锁

在分布式系统中,常用到分布式锁,它有多中实现方式,如:基于redis,database,zookeeper等。Spring integration组件有这三种服务的分布式锁实现,今天来看看用的比较多的redis和database实现方式。 …

【EI会议征稿通知】2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024)

2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024) 2024 3rd International Conference on Biomedical and Intelligent Systems (IC-BIS 2024) 2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024) 将于2024年4月…

为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive 局限性问题: reactive本身存在一些局限性,可能会在开发过程中引发一些问题。这需要额外的注意力和处理,否则可能对开发造成麻烦。数据类型限制: reactive声明的数据类型仅限于对象,而…

Html零基础入门教程(非常详细)

文章目录 1.认识HTML2.html 框架3.HTML常见标签4.HTML语法特征5.列表 1.认识HTML html是超文本标记语言: 目前最新版本是html5,由w3c(万维网联盟)完成标准制定。 声明文档的类型是html5 超文本标记语言。 HTML ,全称“Hyper Text Markup Language(超文…

LNMP架构(搭建论坛+博客)

目录 一、LNMP架构概述 1、LNMP架构的概念 2、LNMP架构的优点 二、编译安装nginx软件 1、准备工作 1.1 关闭防火墙 1.2 安装依赖包 1.3 创建运行nginx用户 1.4 压缩包解压 2、编译与安装 3、添加nginx自启动文件 三、编译安装mysql软件 1、准备工作 1.1 安装mysq…

利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

JVM-堆

一、概念 堆是Java虚拟机内存结构中的一部分。通过new关键字创建的对象都会分配在堆中。堆中的对象是线程共享的,需要考虑线程安全问题,堆中有垃圾回收机制。 二、堆内存溢出 虽然堆中有垃圾回收机制,但是如果当堆中的数据都仍需要使用&am…

width:100%和width:auto有啥区别

项目中使用了with属性,突然好奇auto 和 100% 的区别,特地搜索实践总结了一下观点 一、 width属性介绍二、 代码带入三、 分析比较四、 总结 一、 width属性介绍 width 属性用于设置元素的宽度。width 默认设置内容区域的宽度,但如果 box-siz…

Vue3切换路由白屏刷新后才显示页面内容

1.首先检查页面路由以及页面路径配置是否配置错误。 在router-view 中给路由添加key标识。 !!注意:有使用layout封装布局的,是在layout下的主页面中的 router-view 添加标识,不是在src根目录下main.vue中修改&#xf…

基于vue-office实现docx、xlsx、pdf文件的在线预览

概述 在做项目的时候会遇到docx、xlsx、pdf等文件的在线预览需求,实现此需求可以有多种解决方式,本文基于vue-office实现纯前端的文件预览。 效果 如下图,分别为docx、xlsx、pdf三种类型的文件在线加载后的效果。你也可以访问官方预览网址…

sawForceDimensionSDK安装,sigma7+ros

force dimension的sdk中没有关于ros,借助开源的sawForceDimensionSDK实现对于数据的封装和可视化,方便后续使用 链接: GitHub - jhu-saw/sawForceDimensionSDK 具体步骤: 安装qt和ros,官网下载Force Dimension SDK …

小马识途营销顾问解析舆情处置方法

大部分知名企业都逃不过负面舆情这一关,有负面不一定企业就不规范,产品就不好。其实,企业做大了,难以做到尽善尽美,有时候是同行不正当竞争造成的…… 总之,网络平台上面的负面舆情信息的影响不可小视&…

什么是回表、索引覆盖、索引下推【重点】

参考链接 【1】https://xiaolincoding.com/mysql/index/index_interview.html#%E6%8C%89%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%88%86%E7%B1%BB 【2】https://www.toutiao.com/article/7095749260137726476/?wid1709192807222 【3】https://zhuanlan.zhihu.com/p/401198674…

算法沉淀——动态规划之两个数组的 dp(下)(leetcode真题剖析)

算法沉淀——动态规划之两个数组的 dp 01.正则表达式匹配02.交错字符串03.两个字符串的最小ASCII删除和04.最长重复子数组 01.正则表达式匹配 题目链接:https://leetcode.cn/problems/regular-expression-matching/ 给你一个字符串 s 和一个字符规律 p&#xff0c…

产品经理岗位的任职资格和职业规划

产品经理主要是商业银行以客户为导向的,具体负责组织银行某一金融产品线的创新设计、生产营销和管理服务的工作。这类人士主要负责应用实施工作,其中产品线由一系列的产品构成,公司的产品经理主要分为全过程产品创新设计专家、全过程产品生产…

武汉灰京文化:跨平台和云游戏,手游行业的未来发展趋势

随着科技的不断进步和智能设备的普及,手游行业正迎来新的发展机遇。武汉灰京文化认为,在这个过程中,跨平台游戏和云游戏作为两大关键技术将推动手游行业迈向更加丰富、便捷和多元化的发展。 跨平台游戏的出现将为玩家带来全新的游戏体验。在…

java常用环境docker安装

配置目录 rocketmqredismysql不配置binlog配置binlog Nacoszookeeper 本文为精简安装,部分不带容器卷映射,仅供以学习使用。 rocketmq nameservice sudo docker run -d \ --privilegedtrue \ --name rmqnamesrv \ -p 9876:9876 \ -e "MAX_HEAP_SI…