MYSQL的事务隔离

本章概览

overview
mysql是一个支持多引擎的系统,并不是所有引擎都支持事务,本篇以innodb为例解析mysql在事务支持的实现。提到事务一定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天来说一下隔离性。

隔离性和隔离级别

当数据库有多个事务同时执行时,就会出现脏读,不可重复读,幻读的问题,为了解决这些问题,隔离级别应运而生。隔离级别包括未提交读(read uncommited),已提交读(read commited),可重复读(repeatable read),串行化(serializable)

  • 未提交读 ,一个事务还没提交的时候,他的变更就被别的事务看到
  • 已提交读,一个事务提交之后,他的变更被其它事物看到
  • 可重复读,一个事务在执行中看到的数据,总是和他启动时看到的数据是一致的,当然其他事务尚未提交的事务,他也是看不到的。
  • 串行化,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
    这四种隔离级别并行性能依次降低,安全性依次提高。
    我用一个例子说明这几种隔离级别。假设数据表t中只有一列,其中一行的值为 1,下面是按照时间顺序执行两个事务的行为。
mysql> create table t(c int) engine=InnoDB;
insert into t(c) values(1);
事务A事务B
启动事务查询得到值1启动事务
查询得到值1,更新值为2
查询得到值v1
提交事务B
查询得到值v2
提交事务A
查询得到值v3
在不同隔离级额别下,v1,v2,v3的值不同
  • 在未提交读隔离级别下,v1= 2,v2= 2 ,v3 = 2,
  • 在已提交读隔离级别下,v1= 1,v2= 2,v3 = 2,
  • 在可重复读隔离级额别下,v1= 1,v2= 1,v3 = 2,
  • 在串行化隔离级别下,v1= 1,v2= 1,v3 = 2,事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。

隔离级别的实现方式

数据库里面会创建一个视图,访问的时候以视图的结果为准,在可重复读级别下,视图是在事务启动时创建,且整个事务只有一个视图,在已提交读隔离级别下,每个sql执行时都会创建这个视图。未提交读和串行化没有试图概念,未提交读直接读取最新记录,串行化使用加锁避免并行访问。

这里以可重复读为例,mysql每次更新都会记录一个回滚操作,记录上的最新值,通过回滚操作获取上一个状态值。比如把一个值从A变到D,会有以下记录。

在视图 1、2、3、4里面,这一个记录的值分别是 A、B、C、D,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 read-view-1,要得到 1,就必须将当前值依次执行图中所有的回滚操作得到。

回滚日志总不能一直保留吧,什么时候删除呢?答案是,在不需要的时候才删除。也就是说,系统会判断,当没有事务再需要用到这些回滚日志时,回滚日志会被删除。就是当系统里没有比这个回滚日志更早的 read-view 的时候

为什么不建议长事务?

  1. 长事务意味着会存很老的事务视图,由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。
  2. 长事务还占用锁资源,也可能拖垮整个库

事物的启动方式

  1. 显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
  2. set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。建议你总是使用 set autocommit=1。

显式开启事务,需要手动提交;非显式开启的事务,需要看autocommit参数,0需要手动提交,1自动提交。

你可以在 information_schema 库的 innodb_trx 这个表中查询长事务

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

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

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

相关文章

旧路由重置新路由设置新路由设置教程|适用于PPPoE拨号

前言 前几天朋友说路由器想要重置,但不知道怎么弄。所以就想着只帮忙重置路由器的话,只能帮到一个人。但把整个过程写成图文,就可以帮助更多人。 本文章适合电脑小白,请注意每一步哦! 注意事项 开始之前需要确认光猫…

pod控制器的作用

pod控制器的作用 1、动态pv和pvc deployment是控制器 pod空气器:工作负载,workload用于管理pod的中间层,确保podi资源符合预期的状态 预期状态 1、副本数 2、容器重启策略 3、镜像拉取策略 pod、出现故障时重启等等 pod的控制器类型 1、replic…

删除运行框中的文件打开历史记录

当我们使用everything、百度、迅雷等软件,在列表中右键选中打开文件夹时。 当使用 winR 快捷键等方式打开运行时,输入盘符会出现之前打开过的文件夹, 一方面展示的特别多会比较混乱,另一方面 记得在之前的window版本中&#xff08…

WIFI7时代正式来临

Wi-Fi联盟在2024年1月8日宣布推出了Wi-Fi CERTIFIED 7认证,标志着WIFI7时代的正式来临!这一认证引入了一系列强大的新功能,旨在提升Wi-Fi性能并改善各种连接环境。WIFI7支持多用户AR/VR/XR、沉浸式3D培训、电子游戏、混合工作、工业物联网和汽…

架构师之超时未支付的订单进行取消操作的几种解决方案

今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己尝试一把哈! 一、需求如下: 生成订单30分钟未支付,自动取消 生成订单60秒后,给用户发短信 对上述的需求,我们给…

【算法与数据结构】63、LeetCode不同路径 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:参考【算法与数据结构】62、LeetCode不同路径的题目,可以发现本题仅仅是多了障碍物。我们还…

springboot下载图片的简单处理方式

参考地址 springboot:各种下载文件的方式_springboot下载文件-CSDN博客 开箱即用实战 GetMapping("/t1")public void down1(HttpServletResponse response) throws Exception {response.reset();response.setContentType("application/octet-strea…

STM32F103标准外设库——认识STM32(一)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

MySQL存储引擎索引事务

一.存储引擎 1.创建的存储引擎 MyISAM 不支持事务、也不支持外键,索引采用非聚集索引,其优势是访问的速度快,对事务完整性没有要求,以 SELECT 、 INSERT 为主的应用基本上都可以使用这个存储引擎来创建表。 MyISAM 的表在磁盘上…

从零学Java 线程的状态

Java 线程的状态 文章目录 Java 线程的状态线程的基础状态1 常见方法1.1 休眠1.2 放弃1.3 加入1.4 优先级1.5 线程打断1.6 守护线程1.7 线程的状态 - 等待 2 线程安全问题2.1 线程同步: 同步代码块2.2 线程同步: 同步方法2.3 同步规则2.4 线程的状态 - 阻塞2.5 特殊现象: 死锁 …

新版网易滑块

突然发现脸皮厚根本没用,大冬天的,风吹过来还是会冷。 大哥们多整件衣裳,好冷!!!! 网易更新了,这俩 dt跟f值。 dt为 这里返回的,忽略掉他。 data参数中的d值&#xff…

未来气膜体育馆的发展趋势是什么?

未来气膜体育馆的发展趋势是多方面的,以下是其中几个方面的趋势。 起初,随着人们对体育运动的需求不断增加,气膜体育馆的建设和使用将成为一种趋势。气膜体育馆具有灵活性和可移动性的特点,可以快速搭建和拆除,能够适…

低代码平台,新型应用程序开发神器

目前低代码平台如火如荼。这一新兴技术为企业提供了一种高效、灵活、快速开发应用程序的方法,并在短时间内取得了巨大成功。然而,我们不得不面对低代码平台的优劣以及其所带来的挑战。本文将深入探讨低代码平台在不同情况下的优劣势,并与您分…

AI能否真的取代程序员?

一个Java程序员从接到需求到最终开发完功能的流程大致如下 首先是理解原型图,设计表结构根据表结构编写增删改查代码与前端联调,完成功能开发 那么以上步骤AI能不能完成呢? 让我们试一下: 第一步,使用 AI助手 解析流…

设计模式之状态模式【行为型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

postman环境变量全局变量设置

postman环境变量、全局变量设置 在公司中,一般会存在开发环境、测试环境、线上环境等,如果需要在不 同的环境下切换做接口测试,显然我们需要把所有接口的域名进行修改,如果接 口测试用例较多,那么修改会非常费力&…

Redis基础系列-哨兵模式

Redis基础系列-哨兵模式 文章目录 Redis基础系列-哨兵模式1. 引言2. 什么是哨兵模式?3. 哨兵模式的配置4. 哨兵模式的启动和验证4.1 主master宕机,看会出现什么问题4.2 重启6379主机 5. 哨兵模式的工作原理和选举原理5.1. SDown主观下线(Subj…

基于Python实现地标景点识别

目录 前言简介地标景点识别的背景 地标景点识别的原理卷积神经网络(CNN)的基本原理地标景点识别的工作流程 使用Python实现地标景点识别的步骤数据收集数据预处理构建卷积神经网络模型模型训练 参考文献 前言 简介 地标景点识别是一种基于计算机视觉技术…

Qt SDL2播放Wav音频

这里介绍两种方法来实现Qt播放Wav音频数据。 方法一&#xff1a;使用QAudioOutput pro文件中加入multimedia模块。 #include <QApplication> #include <QFile> #include <QAudioFormat> #include <QAudioOutput>int main(int argc, char *argv[]) {…

欧姆龙plc学习NJ系列CJ系列资料Sysmac Studio编程软件视频教程

Sysmac Studio是欧姆龙公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编程和配置欧姆龙PLC&#xff08;可编程逻辑控制器&#xff09;和其他自动化设备。Sysmac Studio支持以下型号的欧姆龙PLC&#xff1a;1. NJ系列&#xff1a;NJ501、NJ301、NJ101、…