【MySQL--->事务】

news2024/9/23 1:51:37

文章目录

    • @[TOC](文章目录)
  • 一、基本概念
  • 二、事务的操作
    • 1.设置全局事务隔离级别
    • 2.设置事务提交方式
    • 3.事务操作
  • 三、事务隔离性
    • 1.隔离性概念
    • 2 .隔离级别设置
  • 四、MVCC多版本控制
    • 2. read view

一、基本概念

事务是由若干条具有逻辑相关性的SQL语句组成的,用来完成某种任务的**逻辑单元.**事务具有原子性,一致性,隔离性,持久性4大属性.
原子性:保证事务要么不执行,要么执行完,如果发生错误就回滚到事务发生前的状态,就跟事务没有发生一样.
一致性:保证事务执行前和执行后,数据库的完整性不会被破坏.其他事务看到的数据库是一致的,不会看到事务执行过程中的不确定的数据,一致性是由原子性保证的,与用户逻辑强相关,由用户决定,如果因为用户逻辑导致事务中有的SQL语句没有成功执行,就会造成数据库的不一致.
隔离性:事务操作的数据对于其他事务是隔离的.不会影响其他事务,也不会被其他事务影响.
持久性:事务的结果在数据库中永久有效,不会因为数据库故障被破坏.
事务存在的意义是为了方便上层应用程序的使用,有了事务,应用程序层面就不需要关系,数据库操作失败应该怎么做,并发访问数据库应该怎么做,只需要关心怎么操作数据库,操作过程中的各种问题不需要关心.简化了应用程序的编程模型.
不同的存储引擎支持事务的情况不同.MySQL只有innodb支持事务.myisam不支持事务.show engines\G可以查看存储引擎属性信息.
事务的提交方式有自动提交和手动提交两种,show variables like ‘autocommit’;语句可以查看事务提交方式ON为自动提交,OFF为手动提交set autocommit=1设置自动提交,set autocommit=0设置手动提交

二、事务的操作

1.设置全局事务隔离级别

set global transation isolation level read uncommitted 设置事务隔离级别,设置完毕需要重启终端.
select @@tx_isolation;查看事务隔离级别

2.设置事务提交方式

autocommit=0为非自动提交,1为自动提交方式
在这里插入图片描述

3.事务操作

手动启动事务begin或者start transaction
在这里插入图片描述
事务回滚savepoint 变量名,设置保存点,rollback,回滚.回滚操作可以全部回滚,也可以回滚到保存点,回滚到保存点,保存点之后的数据全部清除,保留之前的数据.
在这里插入图片描述
提交事务commit,提交之后事务就无法再回滚了,如果SQL发生异常程序退出时,SQL会自动回滚到事务开始的时候,与是否自动提交无关.
单个SQL语句也构成事务,当设置自动提交时,每条SQL语句执行完会自动提交,反之需要commit手动提交.

三、事务隔离性

1.隔离性概念

因为事务并发执行需要保持事务的原子性,保证多事务并发时不互相干扰,所以有了隔离性,因为允许事务执行时更具情况,可以收到不同程度的干扰,所有有了隔离级别.
事务隔离级别有4中,读未提交,读提交,可重复读,串行化.
脏读:一个用户事务中读到的数据是其他用户事务未提交的事务,这叫做脏读.
不可重复读, 两个事务并发执行,一个事务执行期间操作的数据因为另一个事务的提交发生了改变,导致结果出现差错叫做不可重复读.
**幻读:**在可重复读的隔离级别下,仍然可以读到新插入并且已提交的数据.
串行化:是事务级别的串行,对每个读的数据行加共享锁,插入,删除,修改都是串行的.

2 .隔离级别设置

设置全局隔离级别,会影响所有终端的隔离级别.
设置会话隔离级别,默认与全局隔离级别一致
在这里插入图片描述
在这里插入图片描述
查看隔离级别
在这里插入图片描述

四、MVCC多版本控制

概念: MVCC是用来解决读写冲突的无锁并发控制.

事务结构: 每个事务都由数据,事务id,隐式主键id,flag标志,回滚指针组成.MySQL内部还维护了一个缓冲区undo log.

flag: 使用delete删除数据不是真的删除数据,而是将数据flag设置为删除,这是出于数据恢复,删除需要移动数据等多方面考虑.

回滚操作: undo log 中存储了与实际写入操作相反的操作,回滚时,执行想反操作即可,例如实际执行insert语句,会在undo log中记录delete语句.

版本链: 每执行一条更新操作,会在undo log中记录数据项的历史版本,然后将历史版本数据项在undo log中的地址记录在已经更新的数据项的回滚指针表项中.多个历史版本就形成版本链,一个版本也叫一个快照,读历史版本也叫快照读.事务提交了,与事务相关,但是与其他

**读写操作并发执行: ** 使用读未提交隔离级别,双方都是当前读(读到的是最新的数据).如果是读提交,一个事务是当前读,一个是快照读.因为读的不是一个数据所以不用加锁,从根本上解决了幻读和脏读和不可重复读的问题.

2. read view

**概念: ** read view是事务进程快照读时创建的一个用于快照可见性判断的类,重要组成成员属性有m_low_limit_id,m_up_limit_id,m_create_trx_id,m_ids;

**m_low_limit_id: ** 高水位,表示与当前事务同时运行事务的id中最大一个事务id加1;
**m_up_limit_id: ** 低水位,表示与当前事务同时运行事务的id中最小的一个事务id;
**m_create_trx_id: ** 当前事务的id;
**m_ids: ** 与当前事务同时在运行的所有事务id;

**检查规则: ** 快照读时会用readview类中的数据对比版本链中数据,如果快照id小于低水位,说明是当前事务运行前就已经提交的数据,或者是id等于m_create_trx_id说明是当前事务的快照,应该看见.如果快照id大于等于高水位,说明该事务是在当前事务运行之后才出现的,不应该被看见.如果m_ids是空说明就当前一个事务在运行,那么所有快照都能被看见.如果快照id在m_ids中说明事务仍在活跃,不应该被看见,如果不在m_ids中说明事务已提交,可以被看见.

可重复读原理: 当事务进行快照读的时候,会创建一个readview对象,一直到当前事务结束都是用一个readview,此时与当前事务同时运行的事务的操作对于当前事务而言是不可见的,就算其他事务在当前事务执行期间结束,readview中仍然会哪些事务当做正在运行的事务,也是不可见的.

**读提交: ** 当前事务每次快照读都会创建新的readview,与当前事务同时运行的其他事务在没有提交前事务id是记录在m_ids中的,提交后当前事务再次快照读将重新创建readview,已经结束的事务id就不会出现在readview中,那么该事务的快照是可见的,就形成了读提交.


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

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

相关文章

java“俄罗斯方块”

首先新建议一个包为Tetris (俄罗斯方块) 类名也叫做Tetris; 代码运行: package Tetris; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.aw…

【运维篇】Redis常见运维命令详解

文章目录 1. 前言2. 连接管理命令详解2.1 AUTH命令2.2 PING命令2.3 SELECT命令2.4 QUIT命令 3. 服务器管理命令详解3.1 FLUSHALL命令3.2 SAVE/BGSAVE命令3.3 SHUTDOWN命令 4. 安全管理命令详解4.1 CONFIG命令4.1.1 CONFIG SET命令用法4.1.2 CONFIG GET命令用法 4.2 AUTH命令 5.…

开源更安全? yum源配置/rpm 什么是SSH?

文章目录 1.开放源码有利于系统安全2.yum源配置,这一篇就够了!(包括本地,网络,本地共享yum源)3.rpm包是什么4.SSH是什么意思?有什么功能? 1.开放源码有利于系统安全 开放源码有利于系统安全 2.yum源配置…

代码随想录刷题】Day16 二叉树

文章目录 1.【104】二叉树的最大深度(优先掌握递归)1.1 题目描述1.2 java代码实现 2.【111】二叉树的最小深度(优先掌握递归)2.1 题目描述2.2 java代码实现 3.【222】完全二叉树的节点个数3.1 题目描述3.2 java代码实现 【104】二…

6 Redis的慢查询配置

1、redis的命令执行流程 redis的慢查询只针对步骤3 默认情况下,慢查询的阈值是10ms 在配置文件中进行配置 //这个参数的单位为微秒 //如果将这个值设置为负数,则会禁用慢日志功能 //如果将其设置为0,则会强制记录每个命令 slowlog-log-slow…

Java21新增特性

版本介绍 Java 21是Java平台的一个新版本,于2023年9月19日由Oracle公司正式发布。这个版本包含了数千个性能、稳定性和安全性更新,以及几十个新功能和增强。其中,15个增强被赋予了自己的JDK增强提案(JEP),…

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测 目录 回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测(…

Linux系统编程 day02 vim、gcc、库的制作与使用

Linux系统编程 day02 vim、gcc、库的制作与使用 01. vim0101. 命令模式下的操作0102. 切换到文本输入模式0103. 末行模式下的操作0104. vim的配置文件 02. gcc03. 库的制作与使用0301. 静态库的制作与使用0302. 动态库(共享库)的制作与使用 01. vim vim是一个编辑器&#xff0…

微服务 Spring Cloud 7,Nacos配置中心的Pull原理,附源码

目录 一、本地配置二、配置中心1、以Nacos为例:2、Pull模式3、也可以通过Nacos实现注册中心 三、配置中心提供了哪些功能四、如何操作配置中心1、配置注册2、配置反注册3、配置查看4、配置变更订阅 五、主流的微服务注册中心有哪些,如何选择?…

在Vue关于ue的computed属性中传递参数

computed的基本用法 computed是Vue实例中一个非常强大的计算属性,它的值主要根据依赖数据而变化。我们可以将一些简单的计算放在computed属性中,从而实现在模板中使用简单的表达式。 但是实际项目中通常有这么一个场景:根据传递不一样的参数值…

pyqt designer的版本问题

之前我的电脑Windows11 python3.12上安装好了pyqt6后,安装不了pyqt6-tools,导致不能使用designer设计师服务。经过摸索,然来只需要安装qt-tools就够了。qt-tools在plugin包里。比如文章顶部的资源包,下载下来直接使用pip安装该whl…

学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 博主首页,更多redis、java等优质好文以及各种保姆级教程等您挖掘! 目录 前言 JetBrains全家桶介绍 申请过程: 获取学…

Appium自动化测试:通过appium的inspector功能无法启动app的原因

在打开appium-desktop程序,点击inspector功能,填写app的配置信息,启动服务提示如下: 报错信息: An unknown server-side error occurred while processing the command. Original error: Cannot start the cc.knowyo…

【NI-DAQmx入门】频率测量

1.频率概述 时域表示给出了信号在采样时刻的幅度。 频率是指循环或周期事件的复现率,对于模拟或数字波形,信号周期的倒数就是频率。快速傅立叶变换 (FFT) 提供了一种检查频域关系的方法。傅里叶定理指出,时域中的任何波形都可以用正弦和余弦的…

【Flink】窗口(Window)

窗口理解 窗口(Window)是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。 本文的重心将放在 Flink 如何进行窗口操作以及开发者如何尽可能地利用 Flink 所提供的功能。 对窗口的正确理解&#xff…

【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解

本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计REST API,通过使用Django来实现一个REST API为例,明确后端开发REST API要做的最核心工作,然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…

Ps:变换

可以向选区、整个图层、多个图层或图层蒙版应用变换 Transform,还可以向路径、矢量形状、矢量蒙版、选区边界或 Alpha 通道应用变换。 若要变换栅格(像素)图像,建议先将其转换为智能对象,以便进行非破坏性的变换。 Ps菜…

【Flink】核心概念:并行度与算子链

并行度(Parallelism) 当要处理的数据量非常大时,我们可以把一个算子操作,“复制”多份到多个节点,数据来了之后就可以到其中任意一个执行。这样一来,一个算子任务就被拆分成了多个并行的“子任务”&#x…

计算机毕业设计 基于SpringBoot的健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解目录

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

3-docker安装centos7

CentOS7.9下安装完成docker后,后续我们可以在其上安装centos7系统。具体操作如下: 1.以root用户登录CentOS7.9服务器,拉取centos7 images 命令: docker pull centos:centos7 2.加载centos7 images并登录验证 命令:…