【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中,那么该事务的快照是可见的,就形成了读提交.


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

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

相关文章

使用 C 语言快速排序将字符串按照 ASCII 码升序排列

示例代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h>static Comp(const void *a, const void *b) {char *pa (char *)a;char *pb (char *)b;return strcmp(a, b); }int main(void) {char strs[3][10] { "bd", &q…

SpringBoot 整合 JdbcTemplate

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

关于爬虫中的hook(defineProperty,hook cookies, hook载荷数据,hookXHR)

关于爬虫中的hook&#xff1a; defineProperty var people {age: 19, }; var count20; console.log(people.age) // 参数&#xff1a;对象 属性名字 函数 Object.defineProperty(people, age, {get: function () {console.log(获取值&#xff01;);return count;},// set: …

C++ map和set的使用

关联式容器 vector、list、deque统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;存储的是元素本身 侧重于单纯的存储数据 关联式容器也是用来存储数据的&#xff0c;里面存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式…

漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(2)

书接上文漫谈广告机制设计 | 万剑归宗&#xff1a;聊聊广告机制设计与收入提升的秘密&#xff08;1&#xff09;&#xff0c;我们谈到流量作为一种有限资源&#xff0c;其分配方式&#xff08;或者交易方式&#xff09;也经历了几个阶段&#xff1a;第一个是谈判定价阶段&#…

新材料工厂生产管理mes系统

万界星空科技新材料云MES系统从需求分析、产品选型、系统集成、可扩展性和灵活性以及安全性和稳定性等多个角度进行考虑。 如果您的企业也属于新材料生产制造行业&#xff0c;同时也计划通过MES系统来进行整个生产过程的数字化管控。 欢迎搜索万界星空科技线上咨询或者直接拨…

论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models

Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型&#xff0c;擅长将文本输入转换为数字表示&#xff0c;捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发&#xff0c;从创建高质量的成对&#xff08;pairwi…

搭建网关服务器实现DHCP自动分配、HTTP服务和免密登录

目录 一. 实验要求 二. 实验准备 三. 实验过程 1. 网关服务器新建网卡并改为仅主机模式 2. 修改新建网卡IP配置文件并重启服务 3. 搭建网关服务器的dhcp服务 4. 修改server2网卡配置文件重启服务并效验 5. 设置主机1的网络连接为仅主机模式 6. 给server2和网关服务器之…

YOLOv4 学习记录

文章目录 整体概况数据增强Mosaic数据增强 基于CSPNet网络思想的架构改进Mish激活函数CSPNetCSPNet 3 大优势Partial Transition 层 CSPDarkNet (yolo v4 中的CSPDarkNet53) NeckSPPNetPAN-FPN 结构 正负样本匹配损失函数IOU 损失函数IOU的2个问题&#xff1a; GIOU Loss示意图…

力扣hot100 两数之和 哈希表

&#x1f468;‍&#x1f3eb; 力扣 两数之和 &#x1f60b; 思路 在一个数组中如何快速找到某一个数的互补数&#xff1a;哈希表 O(1)实现⭐ AC code class Solution {public int[] twoSum(int[] nums, int target){HashMap<Integer, Integer> map new HashMap<&g…

STM32CubeMX学习笔记(2)--DSP库的使用

1.DSP库简介 STM32的DSP库是为了支持数字信号处理应用而设计的&#xff0c;它包含了一系列优化的数学函数和算法&#xff0c;能够在STM32微控制器上高效地执行数字信号处理任务。 DSP库通常包括以下主要特性&#xff1a; 1.数学函数库&#xff1a; 包括各种基本的数学运算函数…

STM32电源名词解析

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

设计模式——责任链模式

文章目录 责任链模式的定义场景示例责任链模式实现方案责任链模式扩展责任链模式的优缺点责任链模式在框架源码中的应用 责任链模式的定义 责任链模式又称职责链模式&#xff0c;是一种行为型设计模式。官方描述&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请…

Python 如何实现职责链设计模式?什么是职责链设计模式?Python 职责链设计模式示例代码

什么是职责链&#xff08;Chain of Responsibility&#xff09;设计模式&#xff1f; 职责链&#xff08;Chain of Responsibility&#xff09;设计模式是一种行为型设计模式&#xff0c;旨在构建一个对象链&#xff0c;每个对象都有机会处理请求&#xff0c;并且可以将请求传…

C++初阶 | [三] 类和对象(中)

摘要&#xff1a;类的6个默认成员函数&#xff0c;日期类 如果一个类中什么成员都没有&#xff0c;简称为空类。然而&#xff0c;空类并不是什么成员都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成6个默认成员函数。默认成员函数&#xff1a;用户没有显式…

python中列表的基础解释

列表&#xff1a; 一种可以存放多种类型数据的数据结构 列表的创建&#xff1a; 1.用【】创建列表 #创建一个空列表 list1[] #创建一个非空列表 list2 [zhang,li,ying,1,2,3] #输出内容及类型 print(list1,type(list1)) print(list2,type(list2))结果&#xff1a; 2.使用list…

《视觉SLAM十四讲》-- 回环检测

文章目录 10 回环检测10.1 概述10.1.1 回环检测的意义10.1.2 回环检测的方法10.1.3 准确率和召回率 10.2 词袋模型10.3 字典10.3.1 字典的结构10.3.2 实践&#xff1a;创建字典 10.4 相似度计算10.4.1 理论部分10.4.2 实践&#xff1a;相似度的计算 10.5 实验分析与评述 10 回环…

股票价格预测 | Python实现基于CNN卷积神经网络的股票预测模型(keras,Conv1D)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 股票价格预测 | Python实现基于CNN卷积神经网络的股票预测模型(keras) 源码设计 import quandl import datetimedf = quandl

FreeRTOS(教程非常详细)

概述&#xff1a; 之前写了关于FreeRTOS的部分内容&#xff0c;为了方便阅读&#xff0c;现在给汇总到一起了。全部学习完后&#xff0c;恭喜你对FreeRTOS有了更深的认知。 第一章 FreeRTOS移植到STM32 第二章 FreeRTOS创建任务 第三章 FreeRTOS任务管理 第四章 FreeRTOS消…

LeetCode【12】整数转罗马数字

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/m0_71120708/article/details/128769894 代码&#xff1a; public String intToRoman(int num) {String[] thousands new String[] {"", "M", "MM", "MMM"};String[] hun…