MySQL_事务的四大特性

1.事务的什么

在学习MySQL的初期,我们通常都是一个一个sql语句的执行,但是在实际开发过程中,我们经常是多个sql语句一起执行,这种多个sql语句在逻辑上要一起执行的就可以看做是一个事务,组成这个事务的多个sql,要不就全部成功执行,要不就全部执行失败;

2.事务的四大特性

1、原子性

        原子性是事务的最重要的也是最根本的性质,我们把多个操作打包成一个整体,要求这个整体的所有操作,要不就全部成功,要不就全部失败,避免了有些操作执行成功,有些操作执行失败了,从而导致产生了中间转态这样的错误的事情发生。我们就把多个操作打包成一个整体,就是事务的原子性。原子就是一个不可切割的整体。

       回滚机制

        事实上事务的每一句sql语句肯定都是要执行的,但是就会出现意想不到的情况,导致有些sql执行成功,有些sql就没有执行到,或者执行失败了,事务就能保证,当事务中的一条sql语句执行失败的时候,数据库就会自动把前面执行过的语句造成的影响给恢复回去,就好像事务的一句sql语句都没有执行那样,实际是数据库根据mysql的日志对数据库进行了恢复操作,我们就把数据库恢复成修改之前的样子称为回滚。

        为了实现回滚机制,数据库在执行事务的时候会记录日志,并把日志写到硬盘中,如果事务执行成功,就会删除掉日志,如果事务执行失败,数据库就会根据日志的操作,把数据库恢复

        1)进行了新增的操作,就把数据库新增的数据删除;

        2)进行了删除操作,就把删除的数据恢复;

        3)进行了修改操作,就把修改的数据恢复;

        4)进行查询操作,没有影响数据库的数据,就不进行任何操作;

2、一致性

        一致性指的是事务执行前后,数据的一致性,不会出现数据对不上的情况。可以理解成对数据库进行了修改了,修改之后的数据是符合要求的,是正确的。

        这也和回滚机制有关,如果事务执行失败,回滚之后的数据也是正确的,回到了事务执行前的转态;如果事务执行成功了,数据也是符合预期的,是正确的。

3、持久性

        一说到持久性,就要想到把数据存储到硬盘了。这里的持久说的也是把数据的存储到硬盘上,即使程序结束,电脑关机了,数据也还存在。如果是存储在内存上,那就是不持久,会因为程序结束或者电脑关机了,存储在内存中的数据就丢失了。

        事务对数据库进行的修改,数据存储到硬盘上,重启依然存在。

4、隔离性

        隔离性是事务的四个特性中最难理解,说是四个中最难,但实际上也不是很难;

        事务的隔离性,描述的数据库并发执行事务时候,产生的情况,数据库是支持多线程的,允许多个事务同时同时访问数据库,数据库服务器就需要把多个事务同时处理好,多个事务一起执行,就会发生以下的问题:

        1)“脏读”问题

                事务A正在对修改数据库中的数据,事务B就来读事务A修改后的数据,但是事务A在事务B读之后,又对事务B读取的数据库数据进行修改,这就会导致事务B读取到的数据和事务A实际提交的数据是不一样的,这个过程中事务B读取到的数据是事务A对数据库的数据修改的临时数据,而这个临时数据有可能就是错误的,我们称这种问题为“脏读”问题。

                对于“脏读”问题的处理方案,数据库就是对数据库的写操作进行加锁,就是说别的事务在写的时候,你就不会对数据进行读操作。

        2)不可重复读问题

                有了对写操作进行加锁,我们就不能再写的时候进行读操作,那我们就可以在写操作完成对数据进行读操作,但是在读的过程中,我们可以进行写操作,这就会出现读的时候,数据发生了变化,导致开始读的时候是结束读的数据是不一样的,这就是不可重复读问题。

                对于不可重复读问题,数据库的解决方案就是在进行读的时候,对读操作进行加锁,不能对数据进行写操作,这样以来就能避免不可重复读问题。

        3)幻读问题

                有了上面的两条规则,我们就不能在写的时候进行读,在读的时候进行写,但是如果事务A修改数据之后提交,事务B在读取数据,事务C不对B读取的数据进行修改,而是对对应的表进行增加/删除数据,这就会导致B读的数据集不一样,要先说明的是这里读的数据集原有的是一致的,就是条数多了或者少了,就是幻读问题,可以认为是不可重复读问题的特殊情况。

                对于幻读问题,数据库的解决方案,就是串行化支持执行事务,也就是一个事务接着一个事务执行,这时候数据库的准确率是最高的,效率是最低的,隔离性是最高的。

        四个隔离等级

        那么数据库对隔离性是如何体现的呢?

        mysql给隔离性提供了四个隔离等级,可以根据实际业务的需求等等,在配置文件中进行修改:

        1)read uncommitted(读未提交):允许读取其他事务未提交的数据,存在脏读+不可重复读+幻读问题,效率最高,准确率最低,并发程度最高,隔离性最低;

        2)read committed(读已提交):只允许读取已经提交事务的数据,对读加锁,解决了脏读问题,存在不可重复读+幻读问题,效率降低,准确率提高,并发程度降低,隔离性提高;

        3)repeatable read(可重复读):对读操作和写操作进行加锁,解决了脏读+不可重复读,存在幻读问题,效率又降低,准确率又提高了,并发程度再降低,隔离性又提高;

        4)serializable(可串行化):解决了脏读+不可重复读+幻读问题,效率最低,准确率最高,并发程度最低,隔离性最高。

        以上的四种事务的隔离级别的选择可以根据实际业务的不同进行选择,比如要做一个跟钱相关的业务,就可以选择串行化隔离级别,以实现最高的数据的准确性,要做一个点赞的系统,就可以选择“读未提交”隔离级别,最求最大的效率等等;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV形态学操作

1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…

PHP旅游门票预订系统小程序源码

🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…

第8章作业

接口ip配置 r2 [r2]interface GigabitEthernet 0/0/0 [r2-GigabitEthernet0/0/0]ip address 13.0.0.3 24 [r2-GigabitEthernet0/0/0]interface GigabitEthernet 0/0/1 [r2-GigabitEthernet0/0/1]ip address 100.1.1.254 24 [r2-GigabitEthernet0/0/1]interface GigabitEthernet…

连续学习、增量学习有哪些应用场景?

游戏场景 在游戏环境中,智能体需要不断学习如何在复杂的环境中取得高分。例如: Atari游戏:智能体通过观察游戏画面(状态)并输出操作(动作)来玩游戏。由于游戏的动态性和复杂性,智能体…

java项目之学术成果管理系统源码(ssm+前端+mysql)

项目简介 学术成果管理系统实现了以下功能: 宠物医院信息管理系统的主要使用者分为管理员:个人中心、用户管理、医生管理、医学知识管理、科室信息管理、医生信息管理、预约挂号管理、医嘱信息管理、药品信息管理、订单信息管理、留言板管理、系统管理…

【Spring+MyBatis】_图书管理系统(下篇)

图书管理系统上篇、中篇如下: 【SpringMyBatis】_图书管理系统(上篇)-CSDN博客 【SpringMyBatis】_图书管理系统(中篇)-CSDN博客 目录 功能5:删除图书 6.1 约定前后端交互接口 6.2 后端接口 6.3 前端…

《STL 六大组件之容器探秘:深入剖析 string》

目录 一、string 类简介二、string 类的常用接口1. 构造函数(constructor function)2. 与容量相关的接口(capacity)3. 与迭代器有关的接口(iterator)4. 与元素访问有关的接口(element access&am…

深⼊理解指针(1)

1. 内存和地址 1.1 内存 我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的 数据也会放回内存中。 那这些内存空间如何高效的管理呢? 其实也是 把内存划分为⼀个个的内存单元&…

解决element-ui的el-select使用filterable属性时,下拉框展开后,点击箭头图标收不回去问题

问题&#xff1a;当el-select下拉组件设置filterable属性时&#xff0c;下拉框展开后&#xff0c;再点击箭头图标下拉框收不回去了 解决方法&#xff1a; 在el-select标签上新增事件 visible-change“selectVisibleChange” focus"selectFocus"的处理 <el-select…

Es的text和keyword类型以及如何修改类型

昨天同事触发定时任务发现es相关服务报了一个序列化问题&#xff0c; 今天早上捕获异常将异常堆栈全部打出来看&#xff0c;才发现是聚合的字段不是keyword类型的问题。 到kibbna命令行执行也是一样的错误 使用 /_mapping查看索引的字段类型&#xff0c;才发现userUniqueid是te…

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…

BFS算法——层层推进,最短之路,广度优先搜索算法的诗意旅程(下)

文章目录 引言一. 迷宫中离入口最近的出口1.1 题目链接&#xff1a;https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现: 二. 最小基因变化2.1 题目链接&#xff1a;https://leetcode.cn/problem…

Linux----Makefile基础

Makefile 是自动化构建工具 make 的配置文件&#xff0c;用于定义编译规则和依赖关系&#xff0c;实现高效增量编译。 初识makefile 1. 什么是 make&#xff1f; 定义&#xff1a; make 是一个命令行工具&#xff08;可执行程序&#xff09;&#xff0c;用于解析并执行 Makef…

leetcode876.链表的中间结点

目录 问题描述示例提示 具体思路思路一 代码实现 问题描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目链接&#xff1a;链表的中间结点 示例 提示 链表的结点数范围是 [1, 100]   1 &…

设计变更滞后导致生产计划混乱?PLM与MES集成实时同步

当产品设计在PLM系统中发生变更时&#xff0c;这些变更信息却无法及时、准确地传递到MES系统中。结果是&#xff0c;车间生产现场仍然按照旧的设计指令执行&#xff0c;导致生产出的产品与设计要求不符&#xff0c;不仅引发质量问题&#xff0c;还可能造成停工、物料浪费甚至客…

20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题

20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题 2025/2/20 19:14 缘起&#xff0c;使用荣品PRO-RK3566开发板配套的百度网盘中的SDK&#xff1a;Android13编译之后&#xff0c;查看RK3566的CPU占用率为400%。 开机就是400%&#xff0c;什么时候都是4…

巧用GitHub的CICD功能免费打包部署前端Node项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

web 通识3

目录 6 通向3.0区块链技术前沿发展 7.主流区块链项目介绍 9.区块链行业应用总览 6 通向3.0区块链技术前沿发展 隔离见证&#xff1a;将一部分信息放在别的地方&#xff0c;这样原本的地方就可以容纳更多的东西 隔离见证和树图都是通过扩大容量来提高性能 闪电网络&#xf…

Hadoop一 HDFS分布式文件系统

一 分布式文件存储 了解为什么海量数据需要使用分布式存储技术 100T数据太大&#xff0c;单台服务器无法承担。于是&#xff1a; 分布式服务器集群 靠数量取胜&#xff0c;多台服务器组合&#xff0c;才能Hold住&#xff0c;如下 分布式不仅仅是解决了能存的问题&#xff…

java练习(33)

ps:题目来自力扣 最强回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…