mySQL—mySQL事务

news2024/9/24 9:21:27

文章目录

  • 什么是事务?
  • 事务定义:
    • 设置事务的目的:
  • 事务提交:
  • 事物的特性
    • 原子性(A)
      • 提交分类:
    • 一致性(C)
    • 持久性(I)
      • 持久性危机
      • 持久性危机如何解决?
      • 为什么用数据缓冲池能保证持久性?
    • 隔离性(D)
  • 事务的隔离等级
    • (1) 读未提交
    • (2)读已提交
    • (3)可重复读
    • (4)串行化
  • 隔离级别出现的问题
    • 脏读:
    • 不可重复读:
    • 幻读

————————————————————————————————

什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。

事务就是保证这两个关键操作要么都成功,要么都要失败。

事务定义:

  • 事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务 ,该业务是一个最小的工作单元)
  • 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
  • 事务只和DML语句有关,或者说DML语句才有事务。(这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。)

设置事务的目的:

保证多条SQL语句要么同时成功,要么同时失败

事务提交:

要达到目的,需要使用事务,事务不能再分,如下:
在这里插入图片描述

id  money
1    600
2    200
---------------------------------------------
#非事务提交——>提交成功
update action set money = 500 where id = 1;
update action set money = 300 where id = 2;
#非事务提交——>提交失败
update action set money = 500 where id = 1;
update action set money = 300 where id = 2 aa;
-- 如果是同时执行两条SQL语句:
-- 那么其中一条执行成功
-- 但是另一条可以能因为种种原因执行失败
---------------------------------------------
#使用事务——>提交成功
START TRANSACTION;
update action set money = 500 where id = 1;
update action set money = 300 where id = 2;
COMMIT;
#使用事务——>提交失败
START TRANSACTION;
update action set money = 500 where id = 1;
update action set money = 300 where id = 2bb;
COMMIT;

事物的特性

原子性(A)

原子性——>当前事务是不可再分的。事务的原子性确保动作要么全部完成,要么完全不起作用;

提交分类:

  • 没有事务——》直接提交
  • 有事务——》进行两阶段提交

SQL语句先提交到redolog日志池,日志池中存储的是undolog日志,多条SQL语句先后提交到undolog日志当中,检测到undolog日志没有问题后,再执行commit,再操作数据。
如果undolog日志有问题,就不能修改数据。
在这里插入图片描述

一致性(C)

一致性——>事务结束时,数据库完整性不能得到破坏(转账之前两者钱数和为600,转账后也要是600),前边我们实现了原子性、持久性、隔离性都是为了保证一致性。

保证原子性、持久性、隔离性都是为了保证事务的一致性
事务结束时,数据库完整性不能得到破坏(转账之前两者钱数和为600,转账后也要是600)

持久性(I)

持久性——>当我们的事务一旦提交,那么他对数据库的改变就是永久的,即使数据库发生故障也不应该对其有任何影响。

持久性危机

——>假设: SQL提交到undolog日志后,出现未知错误,没有执行commit,此时,由于用户已经提交了SQL语句生成了undolog日志,所以用户会收到成功的消息,但是此时数据库并没有成功修改数据,这就造成了持久性危机。(造成持久性危机是因为两段式提交)

持久性危机如何解决?

——> 在数据提交之前进行刷脏
用户提交SQL语句到undologe日志,执行commit后,将sql语句提交到数据缓冲池,数据池会定时对数据缓冲进行刷脏,执行里面还没有执行的语句。

为什么用数据缓冲池能保证持久性?

因为如果在sql语句生成undolog日志之后出现未知错误,此时用户得到成功消息,数据库未改变,那么等未知错误解决之后,通过定期刷脏,还可以根据undolog日志执行提交的sql语句,这样就解决了持久性危机。

隔离性(D)

隔离性——>并发执行的事务是不能相互干扰的

事务的隔离等级

  • 读未提交 read uncommitted
  • 读已提交 read committed
  • 可重复读 repeatable read
  • 串行化 serializable

(1) 读未提交

  • 事物A和事物B,事物A未提交的数据,事物B可以读取到。
  • 这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别。
  • 三种并发问题都没解决。
    在这里插入图片描述
    如果A读取B后,但是B下一步不执行提交,而是执行回滚,那么就会出现脏读

如何解决脏读??——>读已提交

# 1.创建表:
create table t_user(id int primary key auto_increment,username varchar(255));
# 2.设置读未提交的隔离级别
set global transaction isolation level read uncommitted;
    -- 查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;
-- 注:MySQL8中隔离级别的变量跟之前的版本不一样,
-- 之前是tx_isolation,MySQL8改成了transaction_isolation。

(2)读已提交

  • 只能读取到已经提交的数据
  • 事物A和事物B,事物A提交的数据,事物B才能读取到
  • 这种隔离级别高于读未提交
  • 换句话说,对方事物提交之后的数据,我当前事物才能读取到
  • 这种级别可以避免“脏数据”
  • 这种隔离级别会导致“不可重复读取”
  • Oracle默认隔离级别—>读已提交
    在这里插入图片描述
    可以看出,插入但没有提交,是读不出来的,提交之后才能读出来。

解决了脏读问题,产生了不可重复读问题

# 设置读已提交的隔离级别
set global transaction isolation level read committed;
    -- 查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

(3)可重复读

  • 事务A和事务B,事务A提交之后的数据,事务B读取不到
  • 事务B是可重复读取数据
  • 这种隔离级别高于读已提交
  • 换句话说,对方提交之后的数据,我还是读取不到
  • 这种隔离级别可以避免“不可重复读取”,达到可重复读取
  • MySQL默认级别 ——>可重复读
  • 虽然可以达到可重复读取,但是会导致“幻像读”
    在这里插入图片描述
    可见,无论是删除还是添加,commit后都是成功的,但是另一边却还是读出原来的数据,这就是可重复读,读取的是备份数据不是真正的数据。
    这样会造成幻读
# 设置可重复读的隔离级别
set global transaction isolation level repeatable read;
    -- 查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

(4)串行化

事务A和事务B,事务A在操作数据库时,事务B只能排队等待
这种隔离级别很少使用,吞吐量太低,用户体验差
这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发。
在这里插入图片描述

# 设置串行化的隔离级别
set global transaction isolation level serializable;
    -- 查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

隔离级别出现的问题

脏读:

脏读:事务A读取到了事务B修改但是还没有提交的数据
(可以理解为:读取到了undolog日志中的数据,没读取到刷脏后的数据)

如何解决脏读??——>读已提交
在这里插入图片描述

不可重复读:

事务A读取到了事务B提交后的数据,对于数据A来说,读取数据在事务B提交前后的结果是不一样的;
即:对于事务A来说,只能读取事务B已经提交的结果,(假设事务A不知道事务B的存在)所以事务A在 事务B还未提交的时候和在事务B提交之后两个时间点,用同样的sql语句读取到了不同的内容,造成不可重复读。
如何解决不可重复读??——>可重复读

幻读

幻读:当事务A要去查询表当中的数据,与此同时第二个事务对表进行了增删改操作,那么对于事务A来说,查询不到事务B的任何操作。(就跟出现了幻觉一样)

如何解决幻读??——>串行化

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

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

相关文章

【深度学习】实验6布置:图像自然语言描述生成(让计算机“看图说话”)

DL_class 学堂在线《深度学习》实验课代码报告(其中实验1和实验6有配套PPT),授课老师为胡晓林老师。课程链接:https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

关于JVM:内容以及流程释义

对于JVM、GC、类加载,很多人摸不清楚头绪,不知道他们之间的关系。误以为GC和类加载还有JVM区分统称垃圾回收,实则他们包含的东西很多,很细,完整的了解正个JVM的加载过程,就需要全面理解这些东西。 我认为的…

三节锂电池充电管理芯片,IC电路图,BOM物料表

5V输入升压,三节锂电池充电管理芯片,IC电路图和BOM物料表;20V输入降压,三节锂电池充电管理芯片,IC电路图和BOM物料表。 5V输入,三节锂电充电管理系统 1 5V输入升压,三节锂电池充电管理芯片 FS40…

实现网站都变成灰色-filter

如下:当某些情况发生时一些娱乐网站统一变成灰色系,全站的内容都变成灰色了,包括按钮、图片等等。 怎么实现的? 最简单的是考虑所有的内容都统一换了一个 CSS 样式,图片也全换成灰色的,按钮等样式也统一换…

Web3和区块链入门——Web3历史和Web3是什么?

大家好,我是无用,今天跟大家聊下Web3历史和Web3什么。 Web3历史 Web3.0一词最初由英国计算机科学家蒂姆伯纳斯-李(著名的万维网之父)在1998年提出,但是他那个时候所说的Web3.0是自己所提出的语义网络,他认为…

Newsletter 2022-11|HStreamDB 0.11 发布

11月我们发布了 HStreamDB 0.11,修复了多项已知问题。同时也在继续推进 HStream Platform 的开发,并计划于本月底上线首个 Alpha 版本。 v0.11 发布 随着云原生流数据库 HStreamDB 项目的日益成熟,为了更好地适应项目发展,我们决…

零基础入门推荐系统 - 新闻推荐 - 实操1

内容导航: 零基础入门推荐系统 - 新闻推荐 - 实操1赛题数据介绍:数据集介绍:读取数据集:零基础入门推荐系统 - 新闻推荐 - 实操1 赛题数据介绍: 赛题以预测用户未来点击新闻文章为任务,数据集报名后可见并可下载,该数据来自某新闻APP平台的用户交互数据…

torch.autograd

torch.autograd torch.autograd: 提供了类和函数,用来对任意的标量函数进行求导,要想使用自动 求导,只需要对已有的代码进行微小的改变,只需要将所有的tensor包含进VariableVariableVariable对象中即可。 torch.autograd.backwa…

2.2.2同向放大器、同向放大器的设计

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

unity——通过点击按钮进行场景切换

前记 通过点击鼠标进行场景切换请参考: Unity——通过点击鼠标进行场景切换_行秋的博客-CSDN博客通过点击按钮进行场景切换请参考:unity——通过点击按钮进行场景切换_行秋的博客-CSDN博客1.准备两个示例场景 2.点击File—>Build Settings...&#…

网页优化(布局优化、图片优化)

为什么页面优化? 页面扩展灵活提高页面的加载速度提高用户的体验 布局优化-高度自适应 自适应 1.宽高不写 注意:当子元素浮动时,父元素不写高度会引起高度塌陷 2.宽高写%单位 3.使用max-width/min-width/max-height/min-height 高度塌陷 清除高度塌…

Java基础语法纯小白入门

第二天内容: |___01.今日内容概述.mp4 |___02.数据类型转换_自动类型转换.mp4 |___03.数据类型转换_强制类型转换.mp4 |___04.数据类型转换注意事项.mp4 |___05.数据类型转换面试题.mp4 |___06.编码表简单概述.mp4 |___07.Java运算符_算术运算符.mp4 |___08…

【kafka】Timed out waiting for a node assignment

1.概述 在做flink任务的时候,报错 Timed out waiting for a node assignment 详细错误如下 2.源码 在SourceCoordinator中我们调用了start方法启动.启动方法主要做了2件事 创建Enumerator启动Enumerator

Machine Learning机器学习(学习记录)

Machine Learning机器学习 目录Machine Learning机器学习聚类K-Means基本思路k均值算法流程k均值算法的特点k-均值算法的优点:k-均值算法的缺点:sklearn实现KMeansK-Means算法基本思路代码实现K-MeansPython代码实现sklearn实现K-Means参考:聚…

[附源码]Python计算机毕业设计Django小太阳幼儿园学生管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

基于Intel Lake-UP3平台的超声设备方案设计,提供出色的图形和AI性能

超声系统要求 有效的超声系统可加快诊断速度,并帮助医生更快做出更有效的治疗决策。 为此,超声机器要求极高的处理性能和图形渲染效果以提高诊断准确性,并立即获取精确的图像。 类似地,还需要易于移动以适应不断变化的医疗场景和…

p1.第一章 基础入门 -- Python开发环境安装 (一)

1.基础入门 1.1 环境安装 1.1.1 windows环境安装 Python下载地址:https://www.python.org/downloads/ 1.1.1.1 python多版本安装 下载并安装3.6.8 下载Windows x86-64 executable installer,python 3.6.8下载地址:https://www.python.o…

章鱼网络社区治理的4种方式

全长1810字,预计阅读 8 分钟 作者:MiX 2021年10月8日章鱼网络主网启动的时候,创始人 Louis 曾代表核心团队承诺:用3年的时间让章鱼网络转化成一个完全由社区所有,并由社区管理的去中心化协议。 我们认为3年的过渡期是…

【Java】之Java8新特性

Java 基础系列的笔记终于完成了🎉🎉🎉 目录 一、Lambda 表达式 1. Lamdba 表达式概述 2. 使用 Lambda 表达式前后对比 3. 怎样使用Lambda表达式 4. Lamdba表达式总结 二、函数式接口 1. 函数式接口概述 3. Java内置函数式接口 4. 使…

我是怎么从软件测试转到自动化测试岗的?亲身经历分享

相信很多人接触软件测试岗位,都纯功能界面的测试,我也不例外。那个时候是在一广州一家电商公司做测试,做了也有一段时间,熟悉了产品业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松&#xf…