【MySQL】浅谈事务

news2024/9/21 13:45:14

哈喽,大家好~我是你们的老朋友:保护小周ღ  


谈起 “事务”,可能大家都会在心中出现一个大大的 ?,博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制,本质是将多个 sql 语句打包一个整体,要么全部执行成功,要么都不执行,当出现 sql 语句执行到中间的时候 “服务”,从而造成数据安全问题。


本期收录于博主的专栏JavaEE_保护小周ღ的博客-CSDN博客

适用于编程初学者,感兴趣的朋友们可以订阅,查看其它 “JavaEE基础知识”。
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘


一、事务

MySql 本质是客户端、服务器交互的一种机制,双方建立连接后,客户端,通过用 sql 语句,向MySql 服务器发出请求,服务器收到并解析请求,然后在硬盘上“拿出”相关数据,作为响应返回客户端,客户端将数据以临时表的形式展现给用户。MySql 使用硬盘作为存储介质。

以上机制,如果多个客户端同时针对服务器存储的数据进行增删查改,有可能造成数据安全问题

举个例子1: 

举个例子2 :

MySql的事务就是为了解决上述问题。 

事务的本质就是把多个 sql 语句打包一个整体,要么全部执行成功,要么都不执行,当出现 sql 语句执行到中间的时候 “宕机”,造成数据安全问题,事务会将已修改的数据进行 “回滚”(rollback),将数据还原成没有执行之前的状态,主观上看起来就像没有执行过。

以及解决多线程(多个执行流)针对同一存储空间的数据进行修改的造成的数据安全问题。

1.1 事务的使用

1. 开启事务: start  transaction

2. 执行多条 SQL 语句

3. 回滚事务: rollback  /  提交事务:commit

rollback 代表全部执行失败 ,commit 代表全部执行成功

start transaction; // 开启事务

update balance set balance = balance - 100 where name = "张三";
update balance set balance = balance + 100 where name = "李四";

commit; //提交事务

 如此,多条 sql 语句就被打包成一个整体,可以理解为:一条比较 “粗” 的指令。


1.2 事务的特性

关于数据库的事务,具有四个关键的特性:  敲敲黑板,经典面试题哦~

  1. 原子性:原子,我们第一次听到这个名词应该是从初中化学课中了解到的,指化学反应不可再分的基本微粒。所以事务原子性,事务所包含的 sql 语句是一个整体,要么全部被执行,要么全部不执行,在执行的过程中如果发送意外,导致被事务修饰的整体sql 无法全部被执行,就会触发回滚,将数据还原成没有被修改之前的状态。
  2. 一致性事务执行的前后,数据是靠谱的(跟预计的结果一样)。(主要涉及到事务的原子性)
  • 不一致的例子
  • 付款多次,只扣款1次(或者付款1次,扣款多次)。
  • 转账成功了,但是付款的人余额没扣,或者收款的人余额没有增加。
  • 转账成功,我只给你转账了500,结果你的账户多了5000

    3.持久性:事务修改的内容是写到硬盘上的(mysql 是采用硬盘作为存储介质),数据是持久性的存在,不会因为重启而丢失。

    4.隔离性:所谓隔离性就是为了解决,多个执行流,“并发的”  执行事务所引起的问题,这一点就是涉及到多线程安全问题,多个客户端对同一服务器上的 “事务” 调用处理这种情况——转账。

举个例子:一个餐厅,只有一个窗口,但是此时需要给多个客户提供用餐服务,站在服务员的角度如果客户一窝蜂的来发出请求,服务员指定是手忙脚乱,就有可能在将客户的用餐信息写错(少写,漏写,错写等)。如果是客户排好队一个一个来,服务员的工作质量也会大大提高。多线程(执行流)的情况下,服务器同时处理读个客户端的请求,这个操作就称之为 “并发”。

事务的隔离性,存在的意义就是为了在数据库并发处理事务的时候不会有问题。


1.3 并发执行事务可能产生的问题

1.3.1 脏读问题

脏读问题,在的意思的 “无效” 的意思,不是贬义词。

一个执行流 A 正在对 事务S修饰的 sql 对应的数据进行修改(读到内存),还没来得及将数据写回硬盘,执行流 B 也对 事务S 修饰的 sql 对应的数据 进行了读取,此时执行流 B 读取的操作就称之为“脏读”,读到的数据也被称之为 “脏数据 ”——无效数据,因为,当执行流A 将数据写回硬盘后,执行流 B 在此之前读取的数据就是没有任何意义的。举例上文转账场景二。

为了解决脏读问题,mysql 就引入了 “写加锁” 这样的机制。

当我在写的时候(对数据进行修改),其他人不能读取数据(避免了读取的数据无效),“写操作“ 和 “读操作” 不能同时执行了(并发)。

加锁当然有利也有弊,给 “写操作” 加锁,就降低了并发程度(执行的效率),我写的时候,其他人需要等待我写完,提高了隔离性——多个执行流对数据准确性的带来的影响就越来越小。


1.3.2 不可重复读

针对写操作,约定,我写的时候,不许看,等我提交了,你才能看(这是约定好的写加锁)

我写的时候,你在等待,然后我提交了版本 1 的数据,然后你就可以读取数据,此时我又对该数据进行修改,提交了版本 2 的数据,你刷新一下,重新读取一下,发现,第一次读取到的内容与第二次读取内容并不一样,这个问题就叫做 “不可重复读”。

针对同一存储空间的数据的情况下,执行流 A 提交了数据,此时 执行流 B 开始读取数据,在读取数据的后,执行流 C 也提交了数据,这就意味着执行流 B 如果多次读取数据,读取出来的结果是不相同的,预期在一个读取周期内(事务修饰的读操作),多次读取的结果是一样的,这种情况就叫做”不可重复读“。

为了解决 “不可重复读” 这样的问题,mysql 就引入了 “读加锁” 这样的机制。

约定:一个执行流读取数据的时候,在提交之前,其他执行流不可以进行修改。

通过“读加锁”,又进一步降低了事务并发处理的能力,同时也提高了事务的隔离级别。


1.3.3 幻读

根据上文的讲述,mysql 为了保证在并发处理事务时带来的数据准确性的问题,约定了“读加锁”和“写加锁”,解决了不可重复读和脏读问题。

不可重复读,针对的是同一数据,在一个读取周期内(未提交之前),多次读取的数据是相同的。

幻读问题,针对的是数据的结果集的,在一个读取周期内(未提交之前),第一次读到一条数据,第二次读到了二条数据,第一次读取的数据也在第二次的结果集中存在,也没有改变,区别在于结果集的条数发生了改变。

在读加锁和写加锁的前提下,一个事务两次读取同一个数据,发现读取的数据值是一样的,但是结果集不一样。这种情况称之为 “幻读” 问题。

针对幻读问题,数据库提供的解决方案是使用”串行化“,放弃多个执行流并发处理事务,而是一个一个串行的处理事务——想处理事务的排好队,一个一个来。


1.4 事务的隔离级别

针对上文的三个问题,mysql 数据库提供了不同的解决方案,同时也带来一个概念,隔离级别,隔离性可以看作,一个事务内部的操作及使用的数据对并发的其他执行流是隔离的,某些操作需要排队执行。

1. read uncommitted 没有任何锁限制,执行流并发程度拉满,但是也意味着隔离性很低,数据的准确性也难以保证。

2. 脏读问题,采用”写加锁“,约定写数据的时候,其他执行流不可以读取数据。read committed 给写加锁,降低了多个执行流并发的程度,提高了多个执行流的隔离性。

3. repeatable read 给写和读都加锁,并发程度进一步降低,隔离性提高,数据的准确性也高。

4. serializable 串行化,彻底放弃并行处理,执行流一个一个处理事务,隔离级别是最高的。

以上操作是 mysql 内部的机制。


好了,到这里,网络编程中的 博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。 

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

遇见你,所有的星星都落在我的头上……

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

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

相关文章

JMeter入门配置

目录 场景: 环境及工具 : JMeter中文配置: 配置登录接口: 配置响应结果: 配置json提取器 测试json提取器 配置Beanshell后置处理器: http请求右键-->添加---->后置处理器--->Beanshell后置处理…

pta(浙大第四版)五道经典练习题②

目录 ①、递归正序输出整数 ②、递归逆序整数并返回 ③、递归实现十进制转二进制 ④、英语单词排序(​编辑) ⑤、输出月份英文名 ①、递归正序输出整数 题述:给一个正整数n,请利用递归按顺序输出它的每位数,输出一…

【NovelAI 小说SD批量生成 文生图/视频克隆】环境配置和使用方法

【样品】《谜影之夜》文生图全自动版SD一键成片 操作步骤&环境配置地址: 【NovelAI】月产10000全自动批量原创小说短视频支持文生图和视频克隆 该文章面向购买脚本的付费用户,提供所有问题以及解决办法。使用 notepad 打开对应的文件即可&#xff0c…

深度学习部署(Pytorch+windows)

目录 NVIDA GPU驱动 NVIDA GPU驱动 查看电脑显卡类型(电脑——属性——设备管理器——显示适配器) 进入NVIDA官方网站(官方驱动 | NVIDIA)下载对应驱动, 接下来默认安装即可。 安装完成之后,查看自己的…

GitHub项目免费教你提示工程,全中文教学,小白也能懂

转载自 | 量子位 量子位 | 公众号 QbitAI 这个GitHub开源项目,打算手把手教你成为一名提示工程师。 理论与实例结合,浅显易懂,可以免费学习,关键还是中文! 如果觉得GitHub界面看起来不方便,还可以到搭建…

文心领航走进大模型时代,从Q1财报看百度价值重估机遇

大模型风头不减,真正的“灵魂选手”在此刻交出了一季度成绩单,让市场看到了“AI巨头”的本色。 北京时间5月16日美股盘前,百度发布了2023Q1财报。财报显示,其营收和利润双双超市场预期,整体经营质量大幅度提高。在经济…

基于卷积的图像分类识别(四):GoogLeNet (V1~V4 Xception)

本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileNet&#xff0c…

JavaWeb学习-MyBatis-入门

JavaWeb学习-MyBatis-入门 快速入门准备工作配置Mybatis(数据库连接)编写程序mappertest 配置SQL提示JDBC介绍概述案例 数据库连接池概述连接池切换Druid连接池 lombok工具介绍maven坐标案例 来源 快速入门 准备工作 创建SpringBoot工程 数据库表usercreate table user (id …

flume 进阶 自定义source(十)

需求 每隔五秒输出5次数据 pom文件 <dependencies><dependency><groupId>org.apache.flume</groupId><artifactId>flume-ng-core</artifactId><version>1.9.0</version></dependency></dependencies>代码 pac…

NETALAND惊艳上线,平行云助力元宇宙大玩家网易闪亮登场

近日&#xff0c;网易传媒旗下全新的泛娱乐体验空间NETALAND惊艳上线。NETALAND以其近乎于电影质感的场景&#xff0c;趣味的互动模式&#xff0c;流畅、沉浸的交互体验&#xff0c;给营销行业带来了一份新答卷。 NETALAND整合了网易传媒强大的元宇宙技术和丰富的内容生态&…

【Jenkins】新手安装、运行Jenkins(详细教学)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

【c语言】Union共用体

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

如何将 O2OA 集成到企业微信实现微信办公

O2OA 平台拥有配套的原生开发的安卓和 IOS 移动 APP&#xff0c;可以以自建应用的方式集成到企业微信&#xff0c;同步企业微信的企业通讯录作为本地组织人员架构&#xff0c;并且可以将待办等通知直接推送到企业微信进行消息提醒。本篇主要介绍如何将 O2OA 集成到企业微信实现…

4年外包出来人废了,5次面试全挂....

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…

开心档之Java 抽象类

Java 抽象类 目录 Java 抽象类 抽象类 Employee.java 文件代码&#xff1a; AbstractDemo.java 文件代码&#xff1a; 继承抽象类 Salary.java 文件代码&#xff1a; AbstractDemo.java 文件代码&#xff1a; 抽象方法 Salary.java 文件代码&#xff1a; 抽象类总结…

2023海外网红营销策略揭秘:打造品牌曝光的7大技巧

随着全球互联网的普及&#xff0c;海外网红营销成为越来越多出海品牌的首选策略之一。然而&#xff0c;要在海外市场成功打造品牌形象并吸引目标受众并不容易。本文Nox聚星将详细介绍几项关键技巧&#xff0c;帮助您在海外市场中成功实施网红营销。 一、深入了解目标市场 在海…

如何避免软件bug?优化你的测试流程和设计用例方法就对啦!

目录 引言 一、测试流程 二、测试用例设计方法 等价类 边界值 场景设计法 判定表 错误推测法 结语 引言 对于大多数软件开发者和测试人员而言&#xff0c;避免出现bug是一项非常重要的任务。但是&#xff0c;在实际的开发过程中&#xff0c;我们经常容易忽略一些细节…

【Spring Boot】Spring Boot配置文件与Spring Boot日志文件

文章目录 1. 什么是Spring Boot&#xff1f;2. 如何创建Spring Boot项目&#xff1f;3. 验证Spring Boot项目的创建3.1 补充添加依赖3.2 代码示例 4. Spring Boot配置文件4.1 配置文件的作用4.2 配置文件的格式4.2.1 properties的语法4.2.2 yml的语法4.2.3 properties与yml的对…

性能测试工具的选购细节

近年来&#xff0c;随着软件技术的不断发展&#xff0c;为了保证软件系统的稳定性、可靠性和高效性&#xff0c;在软件开发过程中越来越多地使用性能测试工具。但是&#xff0c;如何选择一款合适的性能测试工具并不是一件容易的事情。下面是一些性能测试工具的选购细节&#xf…

Python学习笔记 - 探索5种数据类型

Python作为一门易学且功能强大的编程语言&#xff0c;吸引了众多编程爱好者。在学习Python的过程中&#xff0c;了解其数据类型是十分重要的。这里将向大家介绍Python中的五种常见数据类型&#xff0c;分别是&#xff1a;整数、浮点数、字符串、列表和字典&#xff0c;并且将通…