【MySQL--->事务】

文章目录

    • @[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.hqwc.cn/news/193803.html

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

相关文章

Java 省考试院自学考试考籍管理系统

1) 项目简介 考籍管理系统是省考试院自学考试管理系统的一部分,包括考生考籍档案管理、考生免考管理、课程顶替、考籍转入转出管理、毕业管理和日志管理等功能模块。该项目的建设方便和加强了省考试院对自学考试考籍的一系列管理操作,社会效应明显。…

【开源】基于Vue.js的高校实验室管理系统的设计和实现

项目编号: S 015 ,文末获取源码。 \color{red}{项目编号:S015,文末获取源码。} 项目编号:S015,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

数据结构【DS】图的遍历

BFS 要点 需要一个辅助队列visited数组,防止重复访问 复杂度 时间复杂度:访问结点的时间访问所有的边的时间 广度优先生成树 邻接表存储的图的表示方式不唯一,生成树也不唯一 DFS 复杂度 时间复杂度:访问结点的时间访问所有…

【自然语言处理】【大模型】赋予大模型使用工具的能力:Toolformer与ART

赋予大模型使用工具的能力:Toolformer与ART ​ 本文介绍两种赋予大模型使用外部工具能力的方法:Toolformer和ART。 Toolformer论文地址:https://arxiv.org/pdf/2302.04761.pdf ART论文地址:https://arxiv.org/pdf/2303.09014.pd…

优质好文链接

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

「Verilog学习笔记」根据状态转移表实现时序电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 可得逻辑表达式为 可得逻辑表达式为 timescale 1ns/1nsmodule seq_circuit(input A ,input clk ,input rst_n,outpu…

TCP协议相关实验

文章目录 一.TCP相关实验1.理解CLOSE_WAIT状态2.理解TIME_WAIT状态3.解决TIME_WAIT状态引起的bind失败的方法4.理解listen的第二个参数5.使用Wireshark分析TCP通信流程 二.TCP与UDP1.TCP与UDP对比2.用UDP实现可靠传输(经典面试题) 一.TCP相关实验 1.理解…

STM32电源名词解析

先来简单了解一下各种电源端口的命名 VCC:Ccircuit 表示电路的意思, 即接入电路的电压 VDD:Ddevice 表示器件的意思, 即器件内部的工作电压。 VSS:Sseries 表示公共连接的意思,通常指电路公共接地端电压。 GND:在电…

【图解算法】- 快乐数还能这么解?

一 - 前言 介绍:大家好啊,我是hitzaki辰。 社区:(完全免费、欢迎加入)日常打卡、学习交流、资源共享的知识星球。 自媒体:我会在b站/抖音更新视频讲解 或 一些纯技术外的分享,账号同名&#xff…

golang学习笔记——接口interfaces

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002类型断言例子003巩固练习 Go 语言接口 接口(interface)定义了一个对象的行为规范,只定义规范…

qt-C++笔记之两个窗口ui的交互

qt-C笔记之两个窗口ui的交互 code review! 文章目录 qt-C笔记之两个窗口ui的交互0.运行1.文件结构2.先创建widget项目,搞一个窗口ui出来3.项目添加第二个widget窗口出来4.补充代码4.1.qt_widget_interaction.pro4.2.main.cpp4.3.widget.h4.4.widget.cpp4.5.second…