MySQL-事务隔离机制的实现

news2024/11/20 7:04:01

目录

    • 一、MySQL事务
      • 1、什么是事务
      • 2、事务的四个特性
      • 3、MySQL事务使用
        • 1、显式启动事务语句
        • 2、关闭事务自动提交
    • 二、MySQL事务隔离机制
      • 1、四种隔离级别
      • 2、并发事务引起的问题
      • 3、隔离级别问题
        • 1 、查看mysql事务隔离级别
        • 2、脏读问题
        • 3、不可重复读

一、MySQL事务

1、什么是事务

事务是作为单个逻辑工作单元执行的一系列操作。这些操作要么全部,要么没有,是一个不可分割的工作单元。

例如,购买东西支付的过程中会有一系列操作,如查询余额、加减、更新余额。这些操作必须是同时的。否则,显示你支付成功,但是系统没有收到钱

在MySQL中,事务支持是在引擎层实现的,MyISAM引擎不支持事务

2、事务的四个特性

要成为事务,逻辑工作单元必须满足关系数据库管理系统中的四个特征。

即所谓的ACID:原子性、一致性、隔离性、持久性。

  • 原子性:事务的所有操作要么完成要么未完成,不会在中间阶段结束。

  • 一致性:在事务之前和之后,数据库的完整性限制不会被打破。

  • 隔离性:当多个事务同时访问数据库中的同一数据时,将显示关系。

  • 持久性:事务完成后,事务所做的更改将持久保存,不会丢失。

3、MySQL事务使用

1、显式启动事务语句

begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。

BEGIN; -- 开启事务

START TRANSACTION; -- 开启事务
 
INSERT INTO tb_type_details VALUES ( '1','保洁','保洁岗位','清洁作业','清洁下水道');
 
COMMIT; -- 提交事务
 
ROLLBACK; -- 回滚事务

2、关闭事务自动提交

set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

set autocommit=0 -- 关闭自动提交
 
INSERT INTO tb_type_details VALUES ( '1','保洁','保洁岗位','清洁作业','清洁下水道');
 
COMMIT; -- 提交事务
 
ROLLBACK; -- 回滚事务

二、MySQL事务隔离机制

当在数据库上同时执行多个事务(可以理解为多任务、并发场景)时,可能会发生脏读、不可重复读和幻读。

1、四种隔离级别

为了解决这些问题,MySQL 引入了“隔离级别”的概念。

隔离级别越高,效率就越低,很多时候,我们必须在两者之间找到平衡。SQL标准的事务隔离级别包括:读(取)未提交(read uncommitted)、读(取)已提交(read committed)、可重复读取(repeatable read)和串行化(serializable )。

  • 读未提交RU,Read Uncommitted),它可以读取事务的中间过程。它违反了ACID特性,并且存在脏读取的问题。因此基本上不被使用,可以被忽略。

  • 读已提交RC,Read Committed),这意味着,如果已经提交了其他事务,我们可以看到这也是最常用的级别。然而,由于一些历史原因,RC可能在生产环境中使用不多。

  • 可重复读RR,Repeatable Read)是目前使用最广泛的级别。它的特点是间隙锁定,这仍然是默认级别。在这个级别,死锁、低并发和其他问题经常发生。

  • 串行化(serializable ),不是多版本实现,而是单版本实现,因为它的所有实现都是通过锁实现的。基本上不被使用,可以被忽略。

2、并发事务引起的问题

  • 脏读:事务A读取事务B更新的数据,然后B回滚,因此A读取的数据是脏的(实际上不应该存在的数据)

  • 不可重复读:事务A多次读取相同的数据。事务B在事务A多次读取的过程中更新并提交数据,导致事务A多次捕获同一数据时结果不一致。

一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况

  • 幻读:A查出来数据,此时B提交,A再次查同一数据时结果不一致。一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况

不可重复读和幻读很容易混淆,不可重复读侧重于修改,而幻读侧重于添加或删除。要解决不可重复读取的问题,只需要锁-符合条件的行,而要解决幻读问题需要锁表

3、隔离级别问题

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

1 、查看mysql事务隔离级别

SELECT @@transaction_isolation; -- 查看mysql事务隔离级别

SELECT @@tx_isolation;          -- 查看mysql事务隔离级别

2、脏读问题

将事务隔离级别修改为读未提交,可以看到,事务还没有提交,这时候去查询这条数据,发现数据已经可见了。

START TRANSACTION; -- 事务A
INSERT INTO tb_type_details VALUES ( '1','保洁','保洁岗位','清洁作业','清洁下水道');
select * from tb_type_details where id= 1; 
COMMIT; -- 提交事务

在这里插入图片描述

3、不可重复读

一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况。

BEGIN; -- 开启事务
select * from tb_type_details where id= 1;
UPDATE tb_type_details set type_details='地面清洁' where id= 1;
COMMIT; 
 
select * from tb_type_details where id= 1;

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

通过股票数据接口如何看懂Level-2行情?

交易用户在进行投资的时候,通过股票数据接口来实现自己的盈利目标,今天来聊聊如何看懂Level-2行情? 在交易开盘之后某股快速杀跌,但杀跌后盘面缺不跌反涨,甚至一度差点翻红,如果是五档行情,我们…

高数 | 【数一】 多元函数积分学预备知识 —— 总复习框架总结

自用复习笔记框架整理。 整理参考于 2023版张宇高数18讲、李林讲义等资料。 空间曲线的切线与法平面 曲线由参数方程给出 曲线由方程组给出 空间曲面的切平面与法线 曲面由隐式方程给出 曲面由显式函数给出

[附源码]java毕业设计基于的网上点餐系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

甘露糖-聚赖氨酸|PLL-PEG-mannose|聚赖氨酸-PEG-甘露糖

甘露糖-聚赖氨酸|PLL-PEG-mannose|聚赖氨酸-PEG-甘露糖 聚赖氨酸为淡黄色粉末、吸湿性强,略有苦味,是赖氨酸的直链状聚合物,可以提供PEG接枝修饰甘露糖,甘露糖-聚乙二醇-聚赖氨酸,PLL-PEG-mannose,聚赖氨酸…

Web中间件常见漏洞总结

IIS IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行MicrosoftWindows的互联网基本服务。 IIS目前只适用于Windows系统,不适用于其他操作系统。 解析漏洞 IIS 6.x 基于文件名 该版本默认会将*…

基于源码搭建运行 RocketMQ 主从架构

前言 上一篇 基于 IDEA 搭建 RocketMQ-4.6 源码环境 我们搭建并跑通了 rocketmq 的源码环境 . 本文我们紧接上文, 继续基于源码搭建并运行 broker 主从架构. 1 个 NameServer 节点 (与前文一样)2 个 Broker 节点, 一个作为 Master, 一个作为 Slave1 个 Producer 生产者 (与前…

元强化学习 论文理解 MAESN

论文理解 MAESN主要思想具体实现元学习框架带有隐层状态的策略元学习更新小结主要思想 这篇文章主要关注于如何加强对于新任务的探索性。 动机: 以往探索策略在很大程度上是任务无关的,因为它们旨在提供良好的探索,而不利用任务本身的特定结…

MySQL 经验集总结(更新ing)

文章目录1. 函数使用方法1.1 时间差函数-timestampdiff()1.2 datediff()函数1.3 date_format()函数-日期格式化1.4 substring()函数-截取字符串1.4.1 两个参数1.4.2 三个参数1. 函数使用方法 1.1 时间差函数-timestampdiff() 语法: timestampdiff(unit…

一种能把前端恶意代码关在“笼子”里的技术方案

日新月异的新一代信息化技术使企业信息技术都发生了翻天覆地的变化,推动企业App迈向了“智慧化”“数字化”。 在企业应用数字化转型的推动过程中,数据集中共享、IT(信息技术)/0T(操作技术)融合、物联网终…

RDD调用机制、数据流在RDD中的流通

问题 一直很疑惑spark中数据的流向是如何的,网上的文章基本上都是在讲述RDD的基本概念,看来看去都是些RDD直接相互依赖、Spark构造DAG、RDD计算只能由行动算子触发等一些基础概念,没有解开我的疑惑,因此自己点击源码查看&#xf…

《InnoDB引擎》 Master Thread、IO Thread、Purge Thread

后台线程 后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行的状态。 InnoDB存储引擎是多线程的模型,因此…

用键盘传输小数据,破除解决多层远程访问或防火墙限制不能粘贴复制的问题

经常在项目上遇到这样的问题,由于vpn或者防火墙限制远程连接到服务器时不能进行粘贴复制文本。本机改好的代码还需要在远程机上在敲一遍,并且不能传输文件,每次传输东西都要找管理员给传输文件很麻烦,所以想到了这样一个又蠢又灵活…

ME60单板加载故障维护经验

ME60单板加载故障维护经验 加载是设备管理中重要的模块。它完成系统软件和逻辑软件从主控板的 CFcard下载到接口板或者交换网板的存储区域。接口板或者交换网板的存储区域有以下三种: 1 单板 CFcard存储区域 2 单板 bootrom存储区域 3 单板逻辑芯片内部存储区…

数字先锋 | 教育资源乘云而来!46万城乡学子共享名师课堂

城乡学生同上“一堂课”,是一种怎样的体验?在淄博市张店区重庆路小学的教室里,正在进行着这样一节特殊的数学课。 数学老师演示着手里的教具,将抽象的教材讲解得生动精彩,班级内的同学听得聚精会神。黑板上方的一块屏幕…

聚水潭对接金蝶云星空数据方案

01 系统说明: 聚水潭:是由上海聚水潭网络科技有限公司基于SaaS模式开发的商家ERP软件系统,公司创始团队聚集了一群来自阿里、麦包包等知名企业的技术、仓管、市场营销精英,具有近二十年传统及电商企业的ERP实践经验。秉承互联网开…

软件开发 23个设计模式收集

从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是进行抽象归纳的一个很好的速成思路。后面阅读设计模式后,为了加深理解,对相关图片进行了描绘和微调。 从技术的角度已经有很多好的总结,本文会换一种角…

基于docker部署redis多主多从集群

在docker中部署redis多主多从集群,准备部署三对一主一从服务,共6个 首先获取镜像 这里使用的是6.0.8版本 docker pull redis:6.0.8 启动六个容器 docker run -d --name redis-node1 --net host --privilegedtrue -v /usr/local/redis/node1:/data red…

Vue实现点击按钮或者图标可编辑输入框

博主介绍 📢点击下列内容可跳转对应的界面,查看更多精彩内容! 🍎主页:水香木鱼 🍍专栏:后台管理系统 文章目录 简介:这是一篇有关【Vue - 实现点击按钮(笔图标&#xff…

VS五子棋大战

本项目里面只是浅述了一下基本实现步骤,很多细节的地方都在注释中标注了,如需完整代码请去博主码云哦。zqy (zhang-qinyang1) - Gitee.com 目录 一、用到的关键技术点 二、主要模块 1.使用mybatis操作连接数据库 1.1修改spring配置文件 1.2创建实体…

json.converter

爬虫组件分析目录概述需求:设计思路实现思路分析1.ActivityProcessor2.AssociationJsonConverter3.BaseBpmnJsonConverter4.BoundaryEventJsonConverter5.BpmnJsonConverter拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , …