MySQL中的事务到底是怎么一回事儿

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的,但并不是所有的引擎都支持事务,如MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一。

提到事务,肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。隔离得越严实,效率就会越低,SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。

  • 读未提交:一个事务还没有提交时,它做的变更就能被别的事务看到;

  • 读提交:一个事务提交之后,它做的变更才会被其他事务看到;

  • 可重复读:一个事务在执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,在此级别下,未提交变更对其他事务也是不可见的;

  • 串行化:对于同一行记录,写会加写锁,读会加读锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

模拟一个场景,来对比一下四种隔离级别对SQL执行结果的影响:

建一张表:create table T(c int) engine=InnoDB;

插入一条数据:insert into T(c) values (1);

参照下图中的时间顺序来执行两个事务,四种隔离级别下V1、V2、V3的值分别是多少?

图片

隔离级别V1V2V3
读未提交222
读提交122
可重复读112
串行化112

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图;在“读提交”级别下,这个视图是在每个SQL语句开始执行的时候创建的;在“读未提交”级别下,直接返回记录上的最新值,没有视图的概念,在“串行化”级别下直接用加锁的方式来避免并行访问。

MySQL的默认隔离级别为:可重复读;Oracle的默认隔离级别是:读提交。

可通过执行:show variables like 'transaction_isolation'; 来查看当前的隔离级别。

隔离级别的实现是通过回滚日志来实现的,回滚日志类似下图:

图片

同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。系统会判断当没有事务再需要用到这些回滚日志的时候,也就是系统里没有比这个回滚日志更早的read-view的时候,回滚日志就会被删除。因此,建议尽量不要使用长事务。

显式启动事务的方式:begin或者start transaction,配套的提交语句是commit,回滚语句是rollback。

一般建议将自动提交事务开启,即执行set autocommit=1,当需要使用事务的时候,通过上述显式语句来启动事务。

查找持续时间超过60秒的事务:

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

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

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

相关文章

【教学类-43-14】 20240103 (4宫格数独:正确版:576套) 不重复的基础模板数量:576套

作品展示::——4宫格 576套不重复模板(48页*12套题) 背景需求: 生成4宫格基础模板768套,观看64页内容时,明显看到有错误 【教学类-43-13】 20240103 (4宫格数独:错误版…

[C#]C# OpenVINO部署yolov8实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来,领域内的研究者们…

Python算法例32 统计数字

1. 问题描述 计算数字k在0~n中出现的次数,k可能是0~9中的一个数字。 2. 问题示例 n12,k1,在[0,1,2,3,4,5,6,7,8,9,10&a…

C++ 实现Windows WIFI管理器

文章目录 前言一、代码二、补充知识三、遇到的问题字符集转换 四、剩余问题总结 前言 出于项目需要,需要用C开发一个wifi界面,实现wifi扫描、wifi连接与断开、wifi密码记住的基础功能。 一、代码 话不多说,直接上代码。 #pragma once #inc…

我在CSDN的2023年

一、引言 在2023年的这一年当中,在CSDN的生活让我得到许多知识与启发,也让我获得一些快乐和成就 二、自己的收获 在这一年当中,我从一个只会看别人写的文章解决问题到,可以自己写文章帮别人解决问题,这种成就感是极大…

好用免费的WAF---如何安装雷池社区版

什么是雷池​ 雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动。 Slogan: 不让黑客越雷池半步。 什么是 WAF​ WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。 …

《每天十分钟》-红宝书第4版-性能

在使用垃圾回收的编程环境中,开发者通常无须关心内存管理。不过,JavaScript 运行在一个内存管理与垃圾回收都很特殊的环境。分配给浏览器的内存通常比分配给桌面软件的要少很多,分配给移动浏览器的就更少了。这更多出于安全考虑而不是别的&am…

基于VS2019的C++动态链接库DLL生成与调用

一、理论知识及实践经验 实验注意事项及部分程序编写规范(部分源自ChatGPT-3.5): Ⅰ __declspec(dllexport)和__declspec(dllimport)是用于在C中定义动态链接库(DLL)的关键字。在编写动态链接库时,__declsp…

AIGC年度回顾!2024向量数据库是否还是AI发展方向之一?

引言 2023 年,是 AI 技术大爆发的一年,从年初到年末,全球关心技术发展的人们见证了一次次的 AI 技术升级,也逐步加深着对 AGI 发展的畅想。而伴随着生成式人工智能的飞速发展,向量数据库以其独特的技术优势逐渐崭露头角…

修复移动硬盘显示盘符但打不开问题

问题: 移动硬盘显示盘符,但无法打开。点击属性不显示磁盘使用信息。 分析解决: 这是由于硬盘存在损坏导致的,可以通过系统自带的磁盘检查修复解决,而无需额外工具。 假设损坏的盘符是E,在命令行运行以下命令…

流媒体学习之路(WebRTC)——Pacer与GCC(5)

流媒体学习之路(WebRTC)——Pacer与GCC(5) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全…

数据库-MySQL 启动方式

以管理员身份运行命令行 或者Shell net start //查看所有服务 net start MYSQL80 //启动服务 net stop MYSQL80 //停止服务完整安装MySQL社区版本的 会有这个 启动服务 停止服务 重启服务

C# 进阶语法,Linq入门到详解

什么是Linq LINQ (Language Integrated Query) 即语言集成查询–用来作查询一些操作类库主要负责对象的查询。 1、LINQ to Objects 主要负责对象的查询 2、LINQ to XML 主要负责XML的查询。 3、LINQ to ADO.NET 主要负责数据库的查询。 linq核心就是对数据源的操作 学linq另外…

Linux C获取终端尺寸

可用ioctl读取winsize结构。 结构定义 struct winsize {unsigned short ws_row;unsigned short ws_col;unsigned short ws_xpixel;unsigned short ws_ypixel;};测试代码 #include <stdio.h> #include <sys/ioctl.h> #include <unistd.h> #include <sign…

20240101 SQL基础50题打卡

20240101 SQL基础50题打卡 1211. 查询结果的质量和占比 Queries 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | query_name | varchar | | result | varchar | | position | int | | rating | int | ---…

1. Spring Boot 自动配置 Mybatis

1. Spring Boot 自动配置 Mybatis 自动配置 约定大于配置&#xff0c;缺省的配置看这个注解 EnableConfigurationProperties({MybatisProperties.class})。这个注解中引入了MybatisProperties类&#xff0c;包含了一些默认的配置。 Configuration ConditionalOnClass({SqlSe…

RabbitMQ消息队列常见面试题

前言 本文是对RabbitMQ的常见面试题问答的总结&#xff0c;同时也是一个RabbitMQ的入门学习&#xff0c;还没了解的同学快来认识一下。 1.RabbitMQ消息模型有哪些&#xff1f; &#xff08;1&#xff09;HelloWorld 模型(点对点模型) 一个生产者一个消息队列一个消费者 &a…

三种 SqlSession

三种 SqlSession ​SqlSession​ 是一个接口&#xff0c;并且里面包含了许多 CRUD 操作数据库等方法。 ​SqlSession​​ 它有三个实现类&#xff0c;分别是 SqlSessionManager​​ 、DefaultSqlSession​​ 和 SqlSessionTemplate​​&#xff0c;其中 DefaultSqlSession​​…

使用函数的选择法排序

本题要求实现一个用选择法对整数数组进行简单排序的函数。 函数接口定义&#xff1a; void sort( int a[], int n ); 其中a是待排序的数组&#xff0c;n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列&#xff0c;结果仍然在数组a中。 裁判测试程序样例&am…

15、Kubernetes核心技术 - 探针

目录 一、概述 二、探针类型 2.1、就绪探针&#xff08;Readiness Probe&#xff09; 2.2、存活探针&#xff08;Liveness Probe&#xff09; 三、探针探测方法 3.1、exec 3.2、httpGet 3.3、tcpSocket 四、探针配置项 五、探针使用 5.1、就绪探针&#xff08;Readin…