Mysql事务及其隔离机制/隔离级别

mysql事务特性是什么?

原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。

隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

实现:

持久性:通过 redo log来保证的
原子性:通过 undo log来保证的
隔离性:通过 MVCC 或锁机制来保证的
一致性:通过持久性+原子性+隔离性来保证

事务隔离级别

读未提交
所有事务可以看到其它事务没有提交的结果,会有很多
问题,如脏读、幻读、不可重复读等。
读提交
大多数数据库的默认隔离级别。满足了隔离的简单定义,一个事务只能看到其它事务提交事务做的改变,会引起不可重复读。一个事务执行时,多次select,会看到不同结果。
可重复读
MySQL默认的隔离级别,确保同一个事务,在执行中,多次读取操作数据,会看到同样的数据行。但是有的数据库会有幻读问题。幻读说的是"幻影"行,其它事务可能对表插入了新行。
串行化
事务的最高隔离级别,通过强制事务排序,使之不能相互冲突,解决了幻读的问题。在每个读的数据上加共享锁。可能会导致超时和锁竞争。

MVCC:数据库并发场景下的解决方案

MVCC是高并发版本控制器,用于数据库中对数据库的并发访问。Mysql中InnoDB用这种方法来提高读写事务的并发性能、原因是MVCC是一种不采用锁来控制事务的方式。同时还可以解决脏读,幻读,不可重复读等事务隔离问题,
不能解决更新丢失问题

MVCC实现原理依靠:记录中的3个隐含字段、undo log日志、Read View实现。

  1. 隐含字段:

  2. undo log日志:
    insert undo log:事务进行插入操作时产生、在事务回滚时需要,提交事务后可以被立即丢

update undo log:进行update、delete时产生的undo log、不仅在回滚事务时需要、在快照读时也需要。所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(purge类似jvm中的gc垃圾回收器)

  1. Read View(读视图): 一致性视图
    在快照读会产生Read View视图,事务执行快照读的那一刻,会生成数据库快照,并且记录。记录当前活跃的事务ID(因为每个事务启动开启的时候,都会被分配一个ID,这个ID是递增的,所以越新的事务,ID越大)。

简单说,读视图是记录快照读那一刻所有记录,下次快照时使用的还是同一个Read View所以其它事务修改。
而隔离级别中的RR(可重复读)、和RC(提交读)不同就是差在快照读时

前者创建一个快照和Read View,并且下次快照读时使用的还是同一个Read View所以其他事务修改数据对他是不可见的、解决了不可重复读问题。

后者则是每次快照读时都会产生新的快照和Read View、所以就会产生不可重复读问题。

简述MVCC实现原理:
InnoDB 每一行数据都有一个指向上一个版本数据在undo log日志里的位置指针。如果要执行更新操作,会将原记录放入 undo log 中,并通过隐藏的回滚指针指向 undo log 中的原记录。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版本。

优点:MVCC:读不加锁,读写不冲突。
通过

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

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

相关文章

docker可视化工具Portainer

1:Portainer简介 Portainer是一个docker可视化管理工具,可以非常方便地管理docker镜像容器。官网地址:https://www.portainer.io/ 注:现在Portainer有BE(收费)和CE(免费)版本,安装的…

【音视频、chatGpt】h5页面最小化后,再激活后视频停住问题的解决

目录 现象 观察 解决 现象 页面有时候要切换,要最小化;短时间或者几个小时内切换回来,视频可以正常续上;而放置较长时间,几个小时或者一晚上,切换回来后,视频可能卡死 观察 切换页面&#x…

【解读Spikingjelly】使用单层全连接SNN识别MNIST

原文档:使用单层全连接SNN识别MNIST — spikingjelly alpha 文档 代码地址:完整的代码位于activation_based.examples.lif_fc_mnist.py GitHub - fangwei123456/spikingjelly: SpikingJelly is an open-source deep learning framework for Spiking Neur…

【自用】终端设备(ESP32-S3)连接云服务器 HomeAssistant + MQTT 物联网平台

总览 1.流程概述 2.开始搭建! 3. 一、流程概述 0.总体流程 二、开始搭建 1.下载 MQTTX 客户端( 在PC上 ) https://mqttx.app/zh/downloads 2.新建 MQTTX 连接 0.点击左侧的加号,开始新建连接。 一共需要填写几个参数&#…

会玩这 10 个 Linux 命令,一定是个有趣的 IT 男!

Linux当中有很多比较有趣的命令,可以动手看看,很简单的。 1.rev命令 一行接一行地颠倒所输入的字符串。 运行: $rev如输入:shiyanlou shiyanlou2.asciiview命令 1.先安装aview $sudo apt-get install aview2.再安装imagema…

vue中封装自动计算比例滑块

此插件为另一位漂亮的前端同事小姐姐封装,觉得非常好用于是决定记载下来,便于复用 如图需要动态传入需要分配权重的数组,平均分配可以自动将100%平均分给数组中的值 如果手动拖拽,则会自动计算可拖动最大区域,便于最终总权重必定为100% <el-alert class"merge-alert&…

zookeeper常用命令

zookeeper常用命令 1. 下载安装2. 配置说明2.1 配置 3. zookeeper的常见命令3.1 server端启动停止等命令3.2 客户端连接等命令3.3 客户端简单常用命令3.3.1 查看目录&#xff08;查看数据结构&#xff09;3.3.2 删除目录3.3.3 创建目录3.3.4 创建目录并写入值 查看节点值3.3.5…

Apache JMeter:完全指南

Apache JMeter 是一款开源的性能测试工具&#xff0c;可以用于测试 Web 应用程序、FTP 服务器、数据库等各种类型的服务器。本文将以 JMeter 5.5 为例介绍 JMeter 的使用方法。 下载和安装 由于 JMeter 是使用 Java 开发的&#xff0c;因此在运行之前必须先安装 JDK。您可以在…

Android中tools属性的使用

参考&#xff1a; 1.Android:Tools命名空间原来是有大用处的 2.Android中tools属性的使用 3.工具属性参考文档 4. 命名空间介绍 5. 注解 6. lint 7. 资源压缩shrink-resources 目录 一、概述二、引入tools命名空间三、tools 命名空间的作用有哪些&#xff1f;四、tools 命名空间…

年薪6.5万美元|生物医学老师获美国耶鲁大学博士后职位

I老师就职于双非二本院校&#xff0c;希望通过出国研修以提升科研背景&#xff0c;在公派访学和申请导师出资的博士后之间&#xff0c;其选择了后者。最终我们落实了美国耶鲁大学的职位&#xff0c;头衔为Associate Research Scientist&#xff08;副研究科学家&#xff09;&am…

Selenium 自动化 | 案例实战篇

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…

Observability:识别生成式 AI 搜索体验中的慢速查询

作者&#xff1a;Philipp Kahr Elasticsearch Service 用户的重要注意事项&#xff1a;目前&#xff0c;本文中描述的 Kibana 设置更改仅限于 Cloud 控制台&#xff0c;如果没有我们支持团队的手动干预&#xff0c;则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制…

uniapp动态底部tab栏

实现思路&#xff1a; 创建一个js文件用来存放所有的tabbar,不同的数组表示不同的tabbar组合。 创建一个vue文件用来制作底部tabbar组件。 使用vuex存储用户的身份信息,根据身份信息切换tabbar组合。 具体步骤&#xff1a; 新建一个tabbar.js文件&#xff0c;将…

SpringBoot 整合MyBatis

整合MyBatis 官方文档&#xff1a;http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ Maven仓库地址&#xff1a;https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter/2.1.3 整合测试 导入 MyBatis 所需要的…

数据结构笔记--优先队列(大小根堆)经典题型

1--项目的最大利润 题目描述&#xff1a; 输入&#xff1a;正数数组 costs&#xff0c;costs[i] 表示项目 i 的花费&#xff1b;正数数组 profits&#xff0c;profits[i] 表示项目 i 的花费&#xff1b;正数 k 表示只能串行完成最多 k 个项目&#xff1b;m 表示拥有的资金&…

MySQL事务:确保数据完整性与并发性的关键

MySQL事务&#xff1a;确保数据完整性与并发性的关键 MySQL作为一种广泛使用的开源关系型数据库管理系统&#xff0c;具备强大的事务支持&#xff0c;以确保数据库操作的一致性、隔离性和持久性。本文将深入探讨MySQL中的事务概念、事务隔离级别以及事务的应用场景&#xff0c…

leetcode 516. 最长回文子序列(JAVA)题解

题目链接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_sourceLCUS&utm_mediumip_redirect&utm_campaigntransfer2china 目录 题目描述&#xff1a; 暴力递归&#xff1a; 动态规划&#xff1a; 题目描述&#xff1a; 给你一个…

Python学习过程笔记:主模块(main) 异常处理 命令行参数解析 日志记录 socket模块 类的私有方法 字节字符串

文章目录 1.Python中的主程序2.Python中的异常处理3.Python中的命令行参数解析4.Python中的日志记录5.网络编程socket模块6.Python中的私有方法7.Python中的字节字符串 1.Python中的主程序 if __name__ __main__在Python中&#xff0c;if __name__ __main__ 是一个常见的代码…

百日筑基篇——python爬虫学习(一)

百日筑基篇——python爬虫学习&#xff08;一&#xff09; 文章目录 前言一、python爬虫介绍二、URL管理器三、所需基础模块的介绍1. requests2. BeautifulSoup1. HTML介绍2. 网页解析器 四、实操1. 代码展示2. 代码解释1. 将大文件划分为小的文件&#xff08;根据AA的ID数量划…

简单认识Zabbix监控系统及配置

文章目录 一、zabbix概述1、定义2、zabbix监控原理3、监控对象4、zabbix的3种架构&#xff08;1&#xff09; C/S架构&#xff08;2&#xff09;分布式架构&#xff1a;zabbix-proxy-client架构&#xff08;3&#xff09; master-node-client架构 5、zabbix监控模式 二、部署za…