MySQL(8)事务

目录

1.事务;


1.事务:

1.1 如果CURD不加限制会这么样子?

         可能造成数据同时被修改, 数据修改的结果是未知的.(可以想一下之前的抢票线程问题)

 1.2 事务概念:

        事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部 失败,是一个整体. 事务也是你要处理的一个事情, 包含多条mysql语句.

1.3 事务属性: (ACID)

(1) 原子性; 要么全部成功, 要么全部失败, 只有这两种状态.

(2) 隔离性; 防止多个事务并发执行时由于交叉执行而导致数据的不一致。

(3) 持久性; 对数据的修改是持久的.

(4) 一致性; 事务开始之前和事务结束以后,数据库的完整性没有被破坏。

 1.4 为什么会出现事务:

        目的: 为了让应用层服务.

 1.5 事务版本的支持:

只有InoDB支持事务, MySIAM不支持.

 1.6 事务提交的方式:

(1) 自动提交;

(2) 手动提交:

⭐查看事务提交方式: 

show variables like 'autocommit';

关闭事务自动提交/打开:

set autocommit=0/1;  

 1.7 事务的常见操作方式:

(1) 开始事务: start transaction; begin

(2) 创建保持点: savepoint 名称;

 (3) 回滚保存点: rollback to 保存点;

(4) 异常终止事务: ctrl+\;

(1) 证明未commit,客户端崩溃,隔离级别设置为读未提交,MySQL自动会回滚;

(2) 证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化;

(3) 证明begin操作会自动更改提交方式,不会受MySQL是否自动提交影响

(4) 证明单条 SQL 与事务的关系:

结论:

a. 只要输入begin或者start transaction , 事务便必须要通过commit提交,才会持久化,与是 否设置set autocommit无关

b. 事务可以手动回滚,同时,当操作异常,MySQL会自动回滚;

c. 对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交

d. 可以看出事务具有原子性持久性;

⭐a. 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务 还没有提交), 设置了就可以选择回退到保持点.

b. 一个事务被提交了(commit),则不可以回退(rollback)

 1.8 事务的隔离级别:

隔离性: 就比如学校的学长和你找工作的例子, 学长找工作的经历你可以找到, 但是学长对于你找工作的经历可以不知道, 因为学长以及毕业了. 为了数据不受到干扰就选择了隔离性.

隔离级别:

(1) 读并提交: 所有的事务都可以看到其他事务没有提交的执行结果, 没有隔离性.

(2) 读提交: 大多数数据库的默认的隔离级别一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读即一个事务执行时如果多次 select可能得到不同的结果。 

(3) 可重复读: 它确保同一个事务,在执行 中,多次读取操作数据时,会看到同样的数据行。但是会有幻读问题.

(4) 串行化:最高隔离级别,它通过强制事务排序,使之不可能相互冲突, 从而解决了幻读的问题。它在每个读的数据行上面加上共享锁,但是可能会导致超时和锁竞争.

隔离级别如何实现: 实现不同的锁.

 1.9 查看与设置隔离性:

(1) 查看全局隔离级别:

select  @@global.tx_isolation;

(2) 查看当前会话隔离级别:

select @@session.tx_isolation;

(3) 查看局部隔离级别:

select @@tx_isolation;

(4) 设置隔离级别:

语法: set [session/ global] transaction isolation level [read uncommited / read commited / repeatable read/ serializable];

修改之后一般要退出出现查看才会显示新的隔离级别.

 (1) 读未提交: [Read Uncommitted]

        读取到一个事务还没有commit的数据;

脏读: 一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据.

(2) 读提交: [Read Committed]

        只允许一个查看表数据进行修改, 另外一方在提交之前也看不到提交之后的结果.

不可重复读: 在同一个事务, 不同时间段读取不一样的数据. 

(3) 可重复读: [Repeatable Read]

        当一个事务完成提交之后, 以及另外一个事务进行查看是看不到更新的数据,只有另外一个事务提交了才可以看到.  解决了幻读(一个数据查看多种情况), 使用了锁.

(4) 串行化: [serializable]

        一个事务还没提交之前, 另外一个事务是无法进行修改数据的. 只能等待一个事务提交之后才可以.

总结:

a 隔离级别越严格,安全性越高,但数据库的并发性能也就越低;

b. 不可重复读是数据进行修改; 幻读是数据进行新增.

c. mysql 默认是可重复读

 1.10 一致性:

事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务 成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中 断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一 致)的状态。因此一致性是通过原子性来保证的。 其实一致性和用户的业务逻辑强相关,一般MySQL提供技术支持,但是一致性还是要用户业务逻辑 做支撑,也就是,一致性,是由用户决定的。

 1.11 深入理解隔离性:

数据并发的场景包括:

读读: 不会发生线程安全问题;

读写: 会发生线程安全问题, 可能出现脏读, 幻读, 不可重复读;

写写: 会发生线程安全问题, 可能存在更新数据丢失.

(1) 读写:

解决上诉问题: 多版本并发控制(MVCC), 是一种读写冲突的无锁并发控制.

a. 3个记录隐藏列字段:

DB_TRX_ID: 最近修改的事务ID(6byte);

DB_ROLL_PTR: 回滚指针, 指向上一个版本(7byte); 

DB_ROW_ID: 隐藏自增id(隐藏主键);

删除flag隐藏字段: 并不是删除了, 而是删除flag变了.

b. undo 日志:

MySQL 中的一段内存缓冲区,用来保存日志数据;

c. MVCC操作:

        首先进行对事物加锁; 修改前将数据拷贝到undo log(写时拷贝); 修改原始数据, 以及隐藏字段 DB_TRX_ID, 还有DB_ROLL_PTR 列, 写入undo log的地址; 提交事务,释放锁.

快照: 一个个历史版本; 当前读: 读取最新的数据;

 select 读取的是历史版本;

 1.12 Read View:

读视图: 记录并维护系统当前活跃事务的ID;

本质: 结构体, 类;

主要内容:

class ReadView {// 省略...private:/** 高水位,大于等于这个ID的事务均不可见*/trx_id_t m_low_limit_id
/** 低水位:小于这个ID的事务均可见 */trx_id_t m_up_limit_id;/** 创建该 Read View 的事务ID*/trx_id_t m_creator_trx_id;/** 创建视图时的活跃事务id列表*/ids_t m_ids;/** 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,* 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/trx_id_t m_low_limit_no;/** 标记视图是否被关闭*/bool m_closed;// 省略...
};

 其中 m_ids 用来维护读视图的生成时刻以及活跃事务id.

up_limit_id 记录事务中最小id, 

low_limit_id: 成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1

creator_trx_id: 创建该事务的id.

 1.13 RR 与 RC的本质区别⭐:

(1) Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同;

(2) 在RR级别下第一次快照读会创建一个快照及Read View, 调用快照读使用的是同一个read view, 对之后的修改不可见到; 早于Read View创建的事务所做的修改均是可见.

(3) RC级别下的,事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下 的事务中可以看到别的事务提交的更新的原因.

(4) RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题;

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

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

相关文章

基于python旅游景点满意度分析设计与实现

1.1研究背景与意义 1.1.1研究背景 随着旅游业的快速发展,满意度分析成为评估旅游景点质量和提升游客体验的重要手段。海口市作为中国的旅游城市之一,其旅游景点吸引了大量游客。然而,如何科学评估和提升海口市旅游景点的满意度,…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

算法:二叉树相关

目录 题目一:单值二叉树 题目二:二叉树的最大深度 题目三:相同的树 题目四:对称二叉树 题目五:另一棵树的子树 题目六:二叉树的前序遍历 题目七:二叉树遍历 题目八:根据二叉…

linux搭建mysql主从复制(一主一从)

目录 0、环境部署 1、主服务器配置 1.1 修改mysql配置文件 1.2 重启mysql 1.3 为从服务器授权 1.4 查看二进制日志坐标 2、从服务器配置 2.1 修改mysql配置文件 2.2 重启mysql 2.3 配置主从同步 2.4 开启主从复制 3、验证主从复制 3.1 主服务器上创建test…

4款良心软件,免费又实用,内存满了都舍不得卸载

以下几款高质量软件,若是不曾体验,实在是遗憾可惜。 PDF Guru 这是一款开源免费的PDF编辑软件,打开之后功能一目了然。 可以拆分、合并PDF,也可以给PDF添加水印和密码,同时也可以去除别人PDF里的水印或密码&#xff0…

HouseCrafter:平面草稿至3D室内场景的革新之旅

在室内设计、房地产展示和影视布景设计等领域,将平面草稿图快速转换为立体的3D场景一直是一个迫切的需求。HouseCrafter,一个创新的AI室内设计方案,正致力于解决这一挑战。本文将探索HouseCrafter如何将这一过程自动化并提升至新的高度。 一、定位:AI室内设计的革新者 Ho…

【iOS】类对象的结构分析

目录 对象的分类object_getClass和class方法isa流程和继承链分析isa流程实例验证类的继承链实例验证 类的结构cache_t结构bits分析实例验证属性properties方法methods协议protocolsro类方法 类结构流程图解 对象的分类 OC中的对象主要可以分为3种:实例对象&#xf…

TDesign组件库日常应用的一些注意事项

【前言】Element(饿了么开源组件库)在国内使用的普及率和覆盖率高于TDesign-vue(腾讯开源组件库),这也导致日常开发遇到组件使用上的疑惑时,网上几乎搜索不到其文章解决方案,只能深挖官方文档或…

C++右值引用和移动语义

目录 概念: 左值引用和右值引用 概念: 注意: 左值引用的意义 作函数参数 函数引用返回 右值引用的意义 诞生背景 移动构造 移动赋值 其他应用 万能引用和完美转发 默认的移动构造和移动赋值 概念: 左值:顾…

VulnHub:CK00

靶场搭建 靶机下载地址:CK: 00 ~ VulnHub 下载后,在vmware中打开靶机。 修改网络配置为NAT 处理器修改为2 启动靶机 靶机ip扫描不到的解决办法 靶机开机时一直按shift或者esc直到进入GRUB界面。 按e进入编辑模式,找到ro,修…

思路|如何利用oneNote钓鱼?

本文仅用于技术研究学习,请遵守相关法律,禁止使用本文所提及的相关技术开展非法攻击行为,由于传播、利用本文所提供的信息而造成任何不良后果及损失,与本账号及作者无关。 本文来源无问社区,更多实战内容,…

[python]pycharm设置清华源

国内镜像源有以下几个,因为都是国内的,基本速度差不了太多。 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣&…

爬虫案例(读书网)(下)

上篇链接: CSDN-读书网https://mp.csdn.net/mp_blog/creation/editor/139306808 可以看见基本的全部信息:如(author、bookname、link.....) 写下代码如下: import requests from bs4 import BeautifulSoup from lxml import etreeheaders{…

scottplot5 中 使用signalXY图,如何更新数据?

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

Apache POI 使用Java处理Excel数据 进阶

1.POI入门教程链接 http://t.csdnimg.cn/Axn4Phttp://t.csdnimg.cn/Axn4P建议&#xff1a;从入门看起会更好理解POI对Excel数据的使用和处理 记得引入依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactI…

JVM高频面试点

文章目录 JVM内存模型程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池 Java对象对象的创建如何为对象分配内存 对象的内存布局对象头实例数据对齐填充 对象的访问定位 垃圾收集器找到垃圾引用计数法可达性分析&#xff08;根搜索法&#xff09; 引用概念的扩充回收方…

【Socket套接字编程】(实现TCP和UDP的通信)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

创建通用JS公共模块并发布至npm

title: 创建通用JS公共模块并发布至npm tags: UMD rollup verdaccio npm categories: 模块化 概要内容 创建&#xff1a;JS公共模块 打包&#xff1a;使用rollup 打包公共模块 发布&#xff1a;js公共模块至verdaccio平台 发布&#xff1a;js公共模块至npm平台 如何创建JS公共模…

【PostgreSQL】Windows 上安装 PostgreSQL 16版本

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-支持VForm3表单的选择与支持

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、初始化的时候加载表单 /** 查询表单列表 */ const getFormList () > {listForm().then(res > formOptions.value res.result.records) } 2、开始节点的修改&#xff0c;增加表…