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

news2024/11/15 8:08:40

        事务(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.coloradmin.cn/o/2084804.html

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

相关文章

Python脚本实现向飞书发送卡片消息

目录 1 先创建一个卡片消息2 Python脚本2.1 告警测试2.2 告警恢复 总结 1 先创建一个卡片消息 飞书卡片搭建工具 根据自己的需要创建一个消息卡片: 可以在 卡片源代码 中看到这个卡片的代码信息 2 Python脚本 2.1 告警测试 test.py 文件 ""&quo…

MacOS安装Docker Desktop

目录 安装Docker Desktop 1.下载 2.安装 3.验证 安装Docker Desktop 1.下载 访问Docker官方网站下载页面:https://www.docker.com/products/docker-desktop 选择自己所需的版本下载即可 2.安装 3.验证 1.查询版本号 docker --version 2.也可以运行一个简单的…

【vue、Electron】搭建一个Electron vue项目过程、将前端页面打包成exe 桌面应用

文章目录 前言使用 electron-vue 创建项目1. 安装 vue-cli(如果未安装)2. 使用 electron-vue 模板创建项目3. 安装和配置 electron-builder4. 运行Electron项目5. 打包应用 可能遇到的问题解决Electron vue首次启动巨慢无法加载执行npm run electron:bui…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时(1分钟间隔)的路口的各向通行状况、红绿灯及溢出情况。 优势: 投入少,效果好,无需安装设备; 缺陷: 时间间隔…

数据集不够用?3DGS助力生成带标注的全新扩展数据!

作者主页:https://louiszengcn.github.io/ 论文标题: Realistic Surgical Image Dataset Generation Based On 3D Gaussian Splatting 导读: 近年来,随着AI技术的飞速发展,数据量的增加为数据驱动的神经网络提供了更强…

汽车免拆诊断案例 | 2012 款大众速腾车发动机偶尔抖动

故障现象 一辆2012款大众速腾车,搭载CST发动机和干式双离合变速器,累计行驶里程约为17万km。车主反映,发动机偶尔抖动。 故障诊断 接车后试车,确认发动机怠速偶尔抖动,且在D挡起步时抖动明显。用故障检测仪检测&…

专题◉万字长文!盘点过去一年最出圈的Prompt项目教程,有3份在悄悄更新

1. OpenAI 官方出品 | 提示工程最权威的教程 (最新版) 2023年6月,OpenAI 发布了一篇〖*GPT Best Practice (GPT 最佳实践)* 〗教程,详细介绍 ChatGPT Prompt 交互策略&技巧,并且给出了示例说明。 一年时间过去了,OpenAI 不…

Unity射击游戏开发教程:(33)控制飞机左右移动

在本文中,我将介绍如何在玩家朝该方向移动时添加向左和向右转动的动画。 我们已经将左转和右转动画导入到我们的项目中。在我使用的动画中,它们只有两帧,因为我们希望飞机倾斜得很快,这样玩家在按下相应按钮时就能直接感觉到转弯。 </

为什么帕金森病患者在紧张或焦虑状态下震颤会加重?

为什么帕金森病患者在紧张或焦虑状态下震颤会加重&#xff1f; 帕金森病患者在紧张或焦虑状态下震颤加重的原因可能与多个因素有关。首先&#xff0c;帕金森病与大脑中多巴胺水平的降低有关&#xff0c;这种神经递质的失衡会影响运动控制。当患者感到紧张时&#xff0c;大脑皮…

嵌入式软件开发之状态机与事件驱动分析

状态机是一种程序架构,事件驱动也是一种程序架构,在某些开发场景里面,两者是可以一同合并使用的。 事件驱动的概念 生活中有很多事件驱动的例子,上自习瞒着老师偷睡觉就是很生动的一个。 我们都是从高中时代走过来的,高中的学生苦啊,觉得睡觉是世界上最奢侈的东西, 有时…

运维监控工具 PIGOSS BSM :PostgreSQL数据库监控指标

在PostgreSQL数据库中&#xff0c;为了确保其稳定运行和性能优化&#xff0c;我们需要监控一系列关键的指标。以下是一些主要的PostgreSQL监控指标介绍&#xff1a; 连接数&#xff08;Connections&#xff09;&#xff1a; 定义&#xff1a;连接数是指当前正在与数据库建立连…

数据库管理-第236期 数据库一体机的价值(20240829)

数据库管理236期 2024-08-29 数据库管理-第236期 数据库一体机的价值&#xff08;20240829&#xff09;1 误区2 硬件3 操作系统4 数据库总结 数据库管理-第236期 数据库一体机的价值&#xff08;20240829&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff…

深入探索【Hadoop】生态系统:Hive、Pig、HBase及更多关键组件(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Hadoop简介 2、Hadoop生态系统的构成概览 3、…

native 添加堆栈

第一种方法 montecarloh53b getVehicleModel:default error: frameworks/native/services/surfaceflinger/Android.bp:248:1: module "surfaceflinger" variant "android_arm64_armv8-a": depends on //system/unwinding/libbacktrace:libbacktrace which …

YarnClient发送和接收请求源码解析

YarnClient发送和接收请求流程 Yarn是通过RPC协议通信的&#xff0c;协议类型可以通过查看RpcKind类得知&#xff0c;总共有三种类型&#xff1a; RPC_BUILTIN ((short) 1), // Used for built in calls by tests RPC_WRITABLE ((short) 2), // Use WritableRp…

CentOS 7安装和配置 NFS

前言 NFS 是 Network File System 的缩写&#xff0c;即网络文件系统。功能是让客户端通过网络访问不同主机上磁盘里的数据&#xff0c;主要用在类 Unix 系统上实现文件共享的一种方法。本例演示 CentOS 7 下安装和配置 NFS 的基本步骤。 环境说明 CentOS 7&#xff08;Mini…

Agent Q介绍:具有规划和自愈能力的下一代人工智能代理的研究突破

近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;的功能已经改变了自然语言处理和理解&#xff0c;取得了令人瞩目的里程碑式成就。尽管取得了这些进步&#xff0c;大型语言模型在交互环境中仍面临巨大挑战&#xff0c;尤其是在需要多步骤推理的任务中&#xff0c;如…

变电站智能巡检机器人:构建智能化电力运维新模式

随着现代电力系统规模的不断扩大&#xff0c;变电站作为电力输送和分配的关键节点&#xff0c;面临着越来越高的运维要求。传统的人工巡检方式存在效率低、劳动强度大、安全隐患多等问题&#xff0c;无法满足日益复杂的电力系统需求。在此背景下&#xff0c;变电站智能巡检机器…

偷偷用了这10款AI写作神器,再也没加过班!

前言 [ 自2022年Chat-GPT在全球掀起AI革命浪潮&#xff0c;AI开始在内容的生产方式进行颠覆性改变。 其中&#xff0c;AI写作工具的崛起&#xff0c;为内容创作者打开了一个全新创作世界&#xff0c;无论用户在办公写作、自媒体写作还是兴趣写作&#xff0c;在效率方面都得到…

【数据结构】优先级队列 — 堆

文章目录 前言1. 优先级队列1.1 概念1.2 特性 2. 堆2.1 概念2.2 存储方式 3. 堆的模拟实现3.1 堆的创建3.2 堆的插入3.3 堆的删除 4. PriorityQueue4.1 注意事项4.2 构造器介绍4.3 常用方法介绍 5. 经典题型6. 结语 前言 我们之前学习过队列&#xff0c;它是遵循先进先出原则的…