【MySQL】浅谈事务

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


谈起 “事务”,可能大家都会在心中出现一个大大的 ?,博主的理解——事务就是解决 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 内部的机制。


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

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

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

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

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

相关文章

详解二叉树

🌈目录 一、树形结构​ 🌳1.1 概念1.2 其他概念1.3 树的表示形式 二、二叉树✨2.1 概念2.2 两种特殊二叉树2.3 性质2.4 二叉树存储 三、二叉树的基本操作🙌3.1 前置说明3.2 二叉树的遍历3.3 二叉树的基本操作 四、二叉树的OJ✍️ 一、树形结构…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…

爱奇艺2020校招Java方向笔试题(第一场)

1.计算下列程序的时间复杂度&#xff08;&#xff09; for (i1;i<n;i)for(j1;j<m;j){a1,a2,a3,a4};A.O(n) B.O(mn) C.O(m) D.O(1) 答案:B 2.求递归方程T(n)4T(n/2)n 的解 ( ) A.O(n) B.O(n^2) C.O(n^3) D.O(logn) 答案:B 用Mater公式计算 3.下列关于动态规划算法说法错…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

国货大佬“卡脖子”后王者风范不减?小米卷出光学拍摄“天花板”?| 手机行业社媒心智品牌榜出炉

Social Power 核心解读 1、智能手机“乍暖还寒”&#xff0c;龙头品牌仍稳占消费者心智 比拼屏幕、赶超系统、迭代形态、拓展概念&#xff1f;眼花缭乱过后&#xff0c;产品精益求精&#xff0c;建立稳固的消费者认知&#xff0c;才是“保鲜”关键。在最新发布的数说故事5月…

MyBatis Plus 拦截器实现数据权限控制

一、介绍 上篇文章介绍的MyBatis Plus 插件实际上就是用拦截器实现的&#xff0c;MyBatis Plus拦截器对MyBatis的拦截器进行了包装处理&#xff0c;操作起来更加方便 二、自定义拦截器 2.1、InnerInterceptor MyBatis Plus提供的InnerInterceptor接口提供了如下方法&#x…

基于AI技术的API开发工具,自动化和智能化快速高效开发API

一、开源项目简介 ApiCat 是一款基于 AI 技术的 API 开发工具&#xff0c;它旨在通过自动化和智能化的方式&#xff0c;帮助开发人员更快速、更高效地开发 API。ApiCat 支持 OpenAPI 和 Swagger 的数据文件导入和导出&#xff0c;并可以对用户输入的 API 需求进行分析和识别&a…

真题详解(补码转换)-软件设计(七十四)

真题详解(索引查询)-软件设计&#xff08;七十三)https://blog.csdn.net/ke1ying/article/details/130659024 Composite模式&#xff1a; 以树形结构来表示”整体-部分”的关系&#xff0c;使得单个和团体的使用都具有一致性。 对一个基本有序的数组进行排序&#xff0c;适合…

精彩回顾 | Fortinet Accelerate 2023·中国区巡展厦门站

Fortinet Accelerate 2023中国区 5月16日&#xff0c;Fortinet Accelerate 2023中国区巡展来到魅力“鹭岛”——厦门&#xff0c;技术、产品和业务专家&#xff0c;携手亚马逊云科技、唯一网络等云、网、安合作伙伴&#xff0c;与交通、物流、金融等各行业典型代表客户&#x…

HR真的会嫌弃跳槽频繁的测试人员吗?

我们都知道&#xff1a;“跳槽≠涨薪”&#xff0c;但是对于测试人来说&#xff0c;跳槽绝哔能和升职加薪画上等号啊。 所以&#xff0c;有很多测试人在一家公司常常待不到1年&#xff0c;就另觅新东家&#xff0c;来借此达成升职加薪的目的。 有人提出质疑&#xff1a;为什么测…

嚯——ChatGPT是很强,但也会胡说八道。。。

现在的ChatGPT确实强&#xff0c;但是也会一本正经的胡说八道&#xff0c;例如它回答“nineteen”中有12个字母、或是旗鱼是哺乳动物…… 尽管ChatGPT可以生成流畅甚至优雅的散文&#xff0c;轻松通过困扰了AI领域超过70年的图灵测试基准&#xff0c;但它也可能看起来非常愚蠢…

探讨接口测试颗粒度

偶然间在论坛上看到一个帖子&#xff0c;帖子内容如下&#xff1a; 假设现在有一个新增商品的接口&#xff0c;返回的参数中有新增商品的 id&#xff08;每次返回的 id 都不一样&#xff09;、success&#xff08;判断是否成功&#xff0c;0 失败 1 成功&#xff09; 1. 接口…

Elasticsearch painless脚本教程(包含Java API和SpringDataElasticsearch调用脚本)

Elasticsearch painless脚本 1.什么是painless2.painless的特性3.使用kibana进行准备操作3.1 使用kibana创建索引和映射3.2 使用kibana添加测试数据 4.使用painless执行查询操作关于脚本查询须知4.1 字段查询脚本4.1 排序查询脚本 5.如何使用painless执行更新操作关于脚本查询须…

【机器学习】第二节:线性回归和线性分类

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;机器学习sklearn 描述&#x1f3a8;&#xff1a;本专栏主要分享博主学习机器学习的笔记和一些心得体会。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算…

Text-to-SQL提示工程【Prompt Engineering】

我们刚刚启动了一个开源项目pg-text-query&#xff0c;目标是为文本到 SQL 制作生产就绪的大型语言模型 (LLM) 提示。 我们的目标是 利用 LLM、我们自己对 PostgreSQL 数据库的深入了解以及严格的测试来开发一流的文本到 SQL 的翻译。 推荐&#xff1a;用 NSDT设计器 快速搭建…

【MySQL】C语言连接数据库

在使用数据库的时候&#xff0c;我们是操作客户端方的&#xff0c;向服务器请求数据。MySQL的端口号-3306 连接mysql需要头文件&#xff1a;#include<mysql/mysql.h> 基础连接步骤&#xff1a; 1.创建连接句柄 MYSQL mysql_con;//连接句柄 2.初始化连接句柄mysql_i…

「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

OceanBase 4.1 体验 前言OCP Express在线升级功能租户级物理备库TP&#xff08;事务处理&#xff09;和AP&#xff08;分析处理&#xff09;优化TP 性能优化AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4.1的初体验&#xff0c;国产的分布式数据库也太太太太…

有哪些好用的AI工具?

现在有很多好用的AI工具&#xff0c;以下是一些常用的&#xff1a; 1. TensorFlow&#xff1a;谷歌开发的深度学习框架&#xff0c;支持多种编程语言&#xff0c;包括Python、C、Java等。 2. PyTorch&#xff1a;Facebook开发的深度学习框架&#xff0c;易于使用&#xff0c;…

Redis源码分析之网络模型

Redis网络模型 阅读源码的初衷Redis源码阅读 阅读源码的初衷 很多网上解释这个Redis为啥这么块&#xff1f;都会说Redis这么快的原因会有一个Redis才用了单线程&使用了多路io复用来检查io事件&#xff0c;单线程可以避免多线程对资源的竞争。如果我们使用了多线程那么就需…

ChatGPT其实并不想让开发人员做这5件事情

前言 ChatGPT已经火爆了快半年了吧&#xff0c;紧接着国内也开始推出了各种仿制品&#xff0c;我甚至一度怀疑&#xff0c;如果人家没有推出ChatGPT&#xff0c;这些仿制品会不会出现。而很多人也嗨皮得不行&#xff0c;利用各种方法开始科学上网&#xff0c;用ChatGPT做各种觉…