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;

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

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

相关文章

多任务并行处理相关面试题

我自己面试时被问过两次多任务并行相关的问题: 假设现在有10个任务,要求同时处理,并且必须所有任务全部完成才返回结果 这个面试题的难点是: 既然要同时处理,那么肯定要用多线程。怎么设计多线程同时处理任务呢&…

leetcode递归算法题总结

递归本质是找重复的子问题 本章目录 1.汉诺塔2.合并两个有序链表3.反转链表4.两两交换链表中的节点5.Pow(x,n) 1.汉诺塔 汉诺塔 //面试写法 class Solution { public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a,b…

基于Spring Cloud + Spring Boot的企业电子招标采购系统源码

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

Python等高线图的绘制(Matplotlib篇-11)

Python等高线图的绘制(Matplotlib篇-11)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

Redis(二)

1、redis的持久化 "Redis 如何将数据写入磁盘"&#xff0c;首先要明白的时候&#xff0c;我们使用的redis的数据保存在内存上的&#xff0c;也就是说&#xff0c;只要我们的电脑关机或者重启服务器&#xff0c;那么在内存中的数据就会消失&#xff0c;所以要想持久化…

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中&#xff0c;用于运行在已完成对接该系统的汽车中控台&#xff0c;仪表盘上的车载系统&#xff0c;该系统通过USB或者WI…

【多态模板异常处理表达式】

#include <iostream> #include <vector>using namespace std;template <typename T> class SequenceList { private:vector<T> elements;public:// 获取顺序表的长度int length() const {return elements.size();}// 在指定位置插入元素void insertEle…

前端学习笔记 3:Vue 工程

前端学习笔记 3&#xff1a;Vue 工程 上一篇文章介绍了如何在单一 Html 页面中使用 Vue&#xff0c;本文介绍如何从头开始用 Vue 构建一个前端工程项目。 环境准备 Vue 框架代码的创建依赖于 Node.js&#xff0c;因此需要先安装 Node.js。 创建和启动 创建 通过以下命令可…

Python控制程控电源(USB)

文章目录 前言一、环境搭建1.软件安装2.硬件安装二、设置程控电源连接方式三、Python代码四、验证结果五、pyd文件前言 随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制…

docker如何配置阿里云镜像加速?

登录阿里云后&#xff0c;我们点击右上角的控制台&#xff0c;控制台中搜索镜像加速服务&#xff0c;然后点击帮助文档的官方镜像加速&#xff1a; 点击容器镜像服务控制台&#xff1a; 在镜像工具里面的镜像加速器中就可以看到&#xff1a; 分别执行即可&#xff1a; 之后我们…

NVMe SSD IO压力导致宕机案例解读-3

最后找到问题的根因&#xff1a; NVME硬盘&#xff08;mdts参数为10&#xff09;的max_hw_sectors_kb设置为4096KB。当进行流式DMA映射时。如果单次请求的数据量过大&#xff0c;超过了128KB&#xff0c;导致无法有效利用IOVA优化机制&#xff0c;进而引发了对iova_rbtree_loc…

Nacos配置回滚

前言 很多时候&#xff0c;我们会配置错一些属性&#xff0c;或者需要回滚某些属性&#xff0c;这时候使用Nacos的回滚功能就很方便了 配置回滚 1、在控制台中&#xff0c;选择左侧导航栏的 “配置管理”&#xff0c;进入历史版本&#xff0c;选择Group和data id&#xff0c…

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于回溯搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

Vue3.4更新 “Slam Dunk“发布!!!

Announcing Vue 3.4 | The Vue Point. vue3.4更新官方文档 在vue2即将结束更新的时候&#xff0c;vue3迎来了一个重要的更新。代号为“&#x1f3c0; Slam Dunk”&#xff0c;即"灌篮高手"。这个版本进行了很多显著的内部改进&#xff0c;最重要的是模版解析的底层逻…

burpsuite模块介绍之extender(扩展)

extender Burp提供了对第三方拓展插件的支持,使用户能够编写自定义插件或从插件商店中安装拓展插件。这些Burp扩展程序可以以多种方式定制Burp的行为,包括修改HTTP请求和响应、自定义UI、添加自定义扫描程序检查以及访问关键的运行时信息,如代理历史记录、目标站点地图和扫…

松松2023年工作汇报

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 今天是2024年1月3号&#xff0c;是我们新年上班的第2天。今天我们的开会内容主要是回顾2023年公司整体发展的情况&#xff1a; 1.人员方面 整个2023年是我们松松公司人员是最稳定的一年&#xff0c;招聘了2位兼职…

架构设计系列9,10

架构设计系列9&#xff1a;前端架构和后端架构的区别 前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 定位和职责 ● 前端架构主要…

三分钟入门基于Visio的流程图绘制操作

Visio是微软旗下的一款流程图及其他框图绘制工具&#xff0c;有着广泛应用&#xff0c;其高效的展示功能和便捷快速的操作也广受认可。今天&#xff0c;我们就以最基本的流程图绘制为例来一起探索一下Visio的基础功能和用法。 声明&#xff1a;这篇教程从实用角度出发&#xf…

第5章 【例题】(部分~)

【例5.1】使用继承的案例 //【例5.1】使用继承的案例 #include <iostream> #include <string> using namespace std; class Person{ //声明基类public:Person(string name1,string id_number,int age1);~Person();void show(); //在基类中定义了成员函数show()pri…

全院级医学影像PACS源码,影像采集传输与存储管理、影像诊断查询与报告管理

全院医学影像PACS源码&#xff0c;数字化影像信息系统源码&#xff0c;带三维影像后处理技术 全院影像设备联网与影像信息数字化存储&#xff0c;建立涵盖全院的PACS/RIS系统&#xff0c;实现从预约、登记、分诊、排队叫号、检查、诊断阅片、报告发布、自助胶片打印等流程化管…