Mysql剖析(三)----MySql的事务详解

        事务(Transaction):一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中的各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL、C++或Java)书写的用户程序的执行所引起的,并用形如Begin Transaction 或 End Transation语句(或者函数调用)来界定。事务由事务开始(Begin Transation)和事务结束(End Transation)之间执行的全体操作组成。

一丶事务是指?

        数据库中的事务是指对数据库执行的一批DML操作(INSERT、UPDATE、DELETE),在同一个事务当中,这些操作最终要么全部成功要么全部失败,不会存在部分成功的情况。在Mysql中,只有InnoDB引擎的数据库或表才支持事务。

二、事务及其ACID属性

  • 原子性(Atomicity):把一组操作(一个事务)看成一个整体,这组操作要么全部成功,或者全部失败,不可分割。比如一个service方法中对数据库做了两个写操作,那么这2个写操作需要都成功,一旦某个动作失败就需要全部回滚。
  • 一致性(Consistency):一致性要求任何写到数据库的数据都必须满足于预先定义的规则(数据不能出错),简单来说就是任何时间点都不能出现违反一致性要求的状态。比如:A账户扣减100块,B账户增加100块,如果A扣减成功,B增加失败,那么数据就会出现问题,和我们预先定义的规则不一致。
  • 隔离性(Isolation):多个事务之间是相互隔离的,如果多个事务同时执行产生了影响就可能会出现各种并发问题,比如:脏读,幻读等,针对于不同的并发问题可以通过不同的事务隔离级别来解决。
  • 持久性(Durability):持久性关键在于一旦“完成提交”(committed),那么数据就不会丢失。即使Mysql重启或者宕机数据依然不会丢失,因为数据已经被持久化到磁盘。

三、事务的实现

        事务是实现是基于数据库引的存储引擎,不同的存储引擎对事务的支持程度不一样。Mysql中支持事务的存储引擎有InnoDB,MyISAM;事务的实现就是如实实现ACID的特性。

  • 事务的隔离性就是通过锁实现的;(后续我会专门介绍mysql的各种锁)
  • 事务的原子性、一致性和持久性则是通过事务日志实现
  1. 事务日志:包括重做日志redo log和回归日志 undo log,两种日志均可以视为一种恢复操作,他们的作用不同,redo log是恢复提交事务修改的操作,而undo log是回滚记录到特性版本。它们记录的内容也不同,redo log是物理日志,记录的是物理修改操作,而undo log是逻辑日志,根据每行进行记录;
  2. Mysql通过redo log实现持久性:在InnoDB引擎中,redo log记录的是新数据的备份。在事务提交前,现将redo log 持久化,当系统崩溃时,虽然数据没有持久化,但是redo log已经持久化了。系统可以根据redo log的内容,将所有数据恢复到最新状态。至于数据会异步方式刷新磁盘到Mysql磁盘文件。
  3. Mysql是利用InnoDB的undo log 来实现的原子性:undo log 名为回滚日志,是实现原子性的关键,当事务回滚能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。

四、事务的并发问题

        Mysql作为多线程并发访问的数据库,其明显的特点是资源可以被多个用户共享访问。当多个用户同时访问相同的数据库资源时,如果事务之间没有采取必要的隔离措施,可能会常出现以下四种不确定的情况。

  • 脏读(Dirty Read):事务B读取到了事务A未提交的数据,事务A回滚,事务B读取到的数据就是脏数据;解決办法设置事务隔离级别为可重复读或串行化;
  • 幻读(Phantom Read):事务B以相同的条件读取多次数据读取到的数据条数不一致,通常是因为在多次读之间别的事务insert了数据导致多次读到相同条件的数据条数不一样;
  • 不可重复读(Non-Repeatable Read):在同一事务中对同一个数据多次读取到的结果不一致,通常是因为两次读之间其他事务修改了该数据;
  • 丢失更新(Lost Update):事务并发写的情况B事务的update覆盖了A事务的update,这叫覆盖丢失更新,还有一种是数据回滚丢失更新;
-- 设置事务隔离级别为可重复读
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 设置事务隔离级别为串行化
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

五、事务的隔离级别

        为了避免上述几种问题的发生,Mysql为事务定义了不同的隔离级别,以此来保证数据的稳定性。事务隔离级别由低到高可分为Read Uncommitted(读未提交)、Read Committed(读已提交)、Repeatable Read(可重复度)、Serializable(可串行化)。

  1. Read Uncommitted(读未提交):允许事务读取其他事务未提交的结果(即允许脏读)。是事务隔离级别中等级最低的,也是最危险的,该级别很少实际应用;
  2. Read Committed(读已提交):允许事务只能读取其他事务已经提交的结果,该隔离级别可以避免脏读,但不能避免重复读和幻读情况;
  3. Repeatable Read(可重复读):该级别确保了同一事务的多个实例在并发读取数据时,可以读取到同样的数据行。这种级别可以避免脏读和不可重复读,但不能避免幻读问题,是Mysql默认的隔离级别;
  4. Serializable(可串行化):强制性的对事物进行排序,使之不可能相互冲突,从而解决幻读问题。实际上,这种方式是在每个读的数据行上加了共享锁,但这种级别可能会导致大量的超时现象和锁竞争,所以很少用于实际应用,识时务级别中最高等级的;

        注意:事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也会响应增大。另外,不同的隔离级别可能会造成不同的并发异常;

        不过Mysql的存储引擎通过多版本的并发控制(MultiVersion Concurrency Control,MVCC)机制解决了数据幻读的问题。因此,当Mysql隔离级别为Repeatable Read(可重复读)时,是可以避免幻读问题的出现;

结尾:喜欢的朋友点个赞吧!!! 

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

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

相关文章

设施农业气象站

设施农业气象站的主要作用是为农业生产提供准确的气象数据和预测信息,以帮助农民科学决策和管理农业生产活动。具体作用包括: 提供准确的气象数据:设施农业气象站可以收集并记录气温、湿度、风速、降水量等多种气象信息,并确保数据…

探索存储世界:TF卡与SD卡的奥秘

在这个数字化时代,数据存储变得至关重要。TF卡(TransFlash卡)和SD卡(Secure Digital卡)作为两种常见的存储介质,它们在我们的日常生活中扮演着重要角色。MK米客方德将带您深入了解TF卡的基本概念&#xff0…

Python全网最全基础课程笔记-(一)基础入门

本专栏系列为Pythong基础系列,每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。 以至于为什么要写的这么详细:自己也是学过Python的,很多新手只是简单的过一篇语法&a…

如何从 AWS CodeCommit 迁移到极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版,可以私有化部署,对中文的支持非常友好,是专为中国程序员和企业推出的企业级一体化 DevOps 平台,一键就能安装成功。安装详情可以查看官网指南。 本文将分享如何从 AWS CodeCommit 服务无缝迁…

Gartner首次发布AI代码助手魔力象限,阿里云进入挑战者象限,通义灵码产品能力全面领先

8月29日消息,国际市场研究机构Gartner发布业界首个AI代码助手魔力象限,全球共12家企业入围,阿里云成为唯一进入挑战者象限的中国科技公司。通义灵码在产品功能和市场应用等方面表现优秀,获得权威机构认可。 该报告从技术创新性、产…

webpack--处理资源

在webpack.config.js中进行配置 const path require(path) module.exports {// 入口entry: ./src/main.js,// 输出output: {// 文件的输出路径path: path.resolve(__dirname, dist),// 入口文件打包输出的文件名filename: js/main.js,// 自动清空上次打包结果 原理&#xff…

Vidda电视X Ultra等加入能效补贴,京东天猫可买量大管饱

近日,“能效补贴”成为热门话题。打算给家里更换一台大电视的朋友要留意了,Vidda旗下多款巨屏电视都已支持此次补贴政策,京东和天猫均可下单享受补贴。 据「TMT星球」了解,Vidda是海信旗下的年轻科技潮牌,Vidda电视一…

BugKu练习记录:小山丘的秘密

题目: hill能有什么秘密呢 bugku{PLGTGBQHM} 其中A1,flag全为小写hill解密,a1,所以z0,字母表为zabcdefghijklmnopqrstuvwxy,根据图片上的棋子数得到对应的字母,分别是abczadefz,用工…

驱动开发系列14 - Linux Graphics Wayland 详解

目录 一:概述 二:操作系统如何支持 Wayland 三:显卡驱动如何支持 Wayland 四:Wayland 协议介绍 一:概述 Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因…

Vue的冷门内置指令:优化与性能提升的利器

在Vue.js的广阔生态中,开发者们常常聚焦于那些耳熟能详的内置指令,如v-for用于循环渲染列表,v-if和v-else-if用于条件渲染等。然而,Vue还提供了一系列较为冷门但功能强大的内置指令,它们在某些特定场景下能够显著提升应…

Element-plus组件库基础组件使用

文章目录 按钮图标输入框表格表单对话框文件上传布局容器ElMessage消息提示MessageBox 消息提示框Pagination分页样式表单校验 记录vue3项目使用element-Plus,开发中常用的一些样式 下面这些组件是写增删改查是经常用到的,学习了这个写增删改查会好很多。…

实战docker第一天——windows安装docker,测试,并解决被墙办法

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包在一个名为“容器”的单独环境中,从而确保应用程序在任何环境下都能一致地运行。以下是 Docker 的一些核心概念及其意义: 容器化:Docker 通过将应用程序及…

带头节点单链表和无头节点--简单选择排序

带头节点单链表 void simpleselectsort(LinkList& l)//简单选择排序 { LinkList s;if (l->next NULL || l->next->next NULL)return;LinkList q l->next;//第一个节点for (; q ! NULL; q q->next){int min q->data;s q;for (LinkList pq->next;…

MOS管驱动电路阻值如何选取?以及为什么要有下拉电阻

开通时,电源为高电平,会通过Rg1给MOS的Cgs充电,关断时,Cgs通过Rg2放电.实现慢开快关的过程 如果驱动阻值太大,开关会很慢,会让MOS管的损耗增加,降低了效率,dv/dt,di/dt也…

SpringBoot对接Midjourney Api

提示&#xff1a;SpringBoot对接Midjourney Api 文章目录 目录 文章目录 后端代码 导包 controller层 工具类层 前端代码 申请API 测试结果 后端代码 导包 <!--添加hutool的依赖--><dependency><groupId>cn.hutool</groupId><artifactId&g…

Java设计模式之单例模式详细讲解和案例示范

单例模式&#xff08;Singleton Pattern&#xff09;是Java设计模式中最简单但却非常实用的一种。它确保一个类只有一个实例&#xff0c;并提供一个全局的访问点。本文将通过电商交易系统为例&#xff0c;详细探讨单例模式的使用场景、常见问题及解决方案。 1. 单例模式简介 …

企业产品推广系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;活动资讯管理&#xff0c;产品分类管理&#xff0c;产品信息管理&#xff0c;用户分享管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页…

【Python机器学习】NLP词频背后的含义——奇异值分解

目录 左奇异向量U 奇异值向量S 右奇异向量 SVD矩阵的方向 主题约简 奇异值分解是LSA背后的算法。我们从一个小规模的语料库开始&#xff1a; from nlpia.book.examples.ch04_catdog_lsa_sorted import lsa_models,prettify_tdmbow_svd,tfidf_svdlsa_models() print(prett…

如何消除工人们对TPM管理培训的抵触情绪?

在探讨如何消除工人们对TPM管理培训抵触情绪的问题时&#xff0c;我们首先需要深入理解这种抵触情绪的根源&#xff0c;进而设计出一套既科学又人性化的策略来逐步化解。TPM作为一种旨在通过全员参与&#xff0c;实现设备综合效率最大化的管理模式&#xff0c;其成功实施离不开…

kube-scheduler调度策略之预选策略(三)

一、概述 摘要&#xff1a;本文我们继续分析源码&#xff0c;并聚焦在预选策略的调度过程的执行。 二、正文 说明&#xff1a;基于 kubernetes v1.12.0 源码分析 上文我们说的(g *genericScheduler) Schedule()函数调用了findNodesThatFit()执行预选策略。 2.1 findNodesTha…