事务 ---- mysql

一. 引出事务

在日常开发中, 很多操作不是通过一个SQL完成的, 往往需要多个SQL配合完成

但是当多个SQL操作时, 如果中间出现了特殊的情况(程序崩溃, 系统崩溃, 网络断开, 主机掉电......), 那么可能就会出现, 前面的SQL执行成功, 后面的SQL执行失败了

考虑一个场景: 转账

如果a要给b转账500, 那么a的余额-500, b的余额+500, 那么如果在a的余额-500之后, 就出现了上述的特殊情况, 那么这个钱就消失了

这个时候就要使用到事务

二. 概念

事务, 指把多个操作, 打包成一个整体, 就能够保证, 这个整体要么都执行成功, 要么就一个都不执行, 有效避免, 部分执行, 部分未执行, 产生的一些"中间状态引起的问题"
其实, 如果中间出现问题, 并不是真的一个都没有执行, 事务中的若干个SQL必然是要一条一条执行的, 但是事务能够保证, 当执行到某一条的时候如果出现问题了, 数据库就能够自动把前面的sql造成的影响, 给恢复回去, 恢复完成, 看起来就好像一条sql都没执行的样子
像这样的"翻新"操作, 称为"回滚"(rollback)
为了实现回滚机制, 数据路在执行事务的时候, 记录日志
(数据库的日志是写入到硬盘的文件中)
当事务最终都执行完毕, 中间没有差错, 那么这些记录内容就可以不要了
但是如果执行事务的过程中, 出现问题了, mysql就可以根据日志中记录的内容, 来进行恢复操作
1)之前进行了新增操作, 就把数据删除掉
2)之前进行了删除操作, 就把数据新增回来
3)之前进行了修改操作, 就把数据改回去
4)之前进行了查询操作, 不需要任何恢复行为

三. 事务的基本特性

1. 原子性
上述把多个操作打包成一个整体, 有回滚机制, 能够出发还原的这种特性, 称为"原子性"
2. 一致性
执行事务之前和执行事务完毕之后, 数据是一致的, 不会出现对不上的情况, 其实和回滚是有关的, 一旦触发回滚了, 回滚回去的数据得是对的, 如果顺利执行没有触发回滚, 数据也是符合要求的
3. 持久性
但凡提到持久性, 就要想要: 把数据存储在硬盘上
此处的持久, 指的是程序重启/主机重启, 数据仍然存在
执行事务产生的修改, 会在硬盘上持久保存
4. 隔离性
隔离性主要考虑的是, 数据库并发执行事务时, 产生的情况
并发是指: 多个客户端, 同时给服务器, 发起事务,
此时就需要数据库服务区都能够给处理
如果同时处理, 又可能会出现问题:
1) 脏读问题
数据库中, 如果有事务A和事务B, 事务A针对某个表做出了一些修改, 但是在事务A提交之前(即事务完毕之前), 事务B就对这里的数据进行了读取, 最终就可能出现A后续的操作又把上述数据进行了修改, 导致最终B读到的数据和A提交的数据是不同的, 于是就出现了"脏读问题"
为了避免这样的情况出现, 我们可以针对 "写操作"加锁
本来是执行事务A的时候, B事务可以执行, 但是引入写加锁后, 执行A的过程中, B就不能执行了, 要等待
但是这样就相当于降低了"并发能力", 也就会降低数据库服务器的处理效率, 同时提高了"隔离性", 也提高了数据库的准确性
并发执行事务的过程中, 相互之间影响越小, 隔离性就越高, 影响越大, 隔离性就越低
2) 不可重复读问题
存在三个事务ABC, 事务A针对数据进行修改, 提交, 接下来事务B进行读取数据, 在B执行的过程中, 又有一个事务C, 又针对数据进行修改, 而此时事务B还在对数据进行读取, 就会出现前后读取的数据不一致
为了避免这样的情况出现, 我们可以针对" 读操作"加锁
本来是执行事务B的时候, C事务可以执行, 但是引入读加锁后, 执行B的过程中, C就不能执行了, 要等待
同样这样就相当于降低了"并发能力", 也就会降低数据库服务器的处理效率, 同时提高了"隔离性", 也提高了数据库的准确性
3) 幻读问题
事务A先修改并提交了数据, 事务B进行读数据, 此时事务C, 没有修改B读的数据, 但是给对应的表进行了新增数据/删除数据等操作, 导致事务B中, 读到的数据集不同, 就会出现"幻读问题"
解决幻读的方式, 是 "串行化", 时所有的事务都严格的按照"一个接一个"的方式进行, 完全没有并发了
此时执行的效率是最低的, 隔离性也是最高的, 数据也是最准确的
总结一下: 
1)脏读 ==> 写加锁
2) 不可重复读 ==> 读加锁
3) 幻读 ==> 串行化
mysql事务的隔离性具体是怎么实现呢? mysql给程序猿提供了四个隔离级别, 可以在mysql配置文件中进行设置
1) read uncommitted: 允许读取其他事务未提交的数据
2) read committed: 不允许读取其他事务未提交的数据
3) repeatable read: 针对读操作和写操作都加锁了
4) serializable(串行化): 所有事物都是串行执行的
在实际开发中, 我们要根据具体的应用场景来选择不同的隔离级别

四. 使用事务

1) 开始事务:
start transaction;
2) 回滚或提交:
rollback/commit;
例:
start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

中间的SQL语句, 就被打包成一个整体了

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

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

相关文章

鸿蒙嵌入式设备开发之hello world

1. 环境搭建 目前鸿蒙设备的开发环境,可以分为2个部分:Windows调试环境,和Linux编译环境。 其中, Linux环境负责编译代码,并生成鸿蒙的包。Windows环境负责连接设备,进行烧录和调试。 特别注意&#xf…

访问成员变量(反射)

文章目录 前言一、访问成员变量的方法二、Field类 1.常用方法2.实操展示总结 前言 为了实现随时随地调用某个类的某个成员变量,我们可以通过反射的Field类进行调用。这其中需要我们获取该类的Class对象,再调用Field类的相关方法,实时地灵活地…

mysql 元数据锁(MDL)

因为当我们对数据库表进行操作时,会自动给这个表加上 MDL 对一张表进行 CRUD 操作时,加的是MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁; MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他…

618什么数码好物值得入手?优质数码清单分享,错过等明年!

在到来的618年中大促,各种数码好物竞相亮相,正是您更新装备、升级体验的黄金时刻,在这个购物的狂欢节里,我们特别为大家准备了一份精选的优质数码清单,帮助大家从海量的选择中筛选出真正值得入手的宝贝,这些…

Wireshark抓包日常运维实用过滤

0x0 Wireshark 介绍 Wireshark 是一款功能强大的网络分析工具,适用于网络专业人员。它提供了出色的过滤器,您可以轻松放大到您认为可能存在问题的位置。过滤器的主要好处是消除定位流量,并缩小要查找的数据类型。 0x1 根据源 IP 地址过滤主…

探秘Facebook:社交媒体的未来之路

Facebook,作为全球最大的社交媒体平台之一,一直处于数字社交革命的前沿。然而,随着科技和社会的不断发展,Facebook正面临着新的挑战和机遇。本文将探索Facebook的未来之路,揭示社交媒体的新趋势和发展方向。 1. 深度社…

恢复误删和格式化的文件的利器

一、简介 1、一款由Piriform开发的免费文件恢复工具,它能够帮助用户恢复那些不小心从电脑上删除的文件,包括从回收站清空的文件,以及因用户错误操作而从存储设备中删除的图片、音乐、文档等多种格式的文件。Recuva支持对硬盘、闪存卡、U盘等多种存储介质进行扫描与恢复,并且…

Codeforces Round 951 (Div. 2) F. Kostyanych‘s Theorem(思维题 交互好题)

题目 交互题&#xff0c;n&#xff08;n<1e5&#xff09;个点的完全图&#xff0c;无向的&#xff0c;初始恰好删了n-2条边 每次询问可以输入一个d&#xff1a;? d 交互器会输出一个当前度>d的点v&#xff0c; 如果有多个这样的点&#xff0c;输出度最小的&#xff…

DALL-E 2: 重新定义图像生成的人工智能

前言 随着人工智能技术的迅猛发展&#xff0c;图像生成已经成为AI研究领域中的一个重要方向。OpenAI推出的DALL-E 2无疑是其中的佼佼者。这一强大的生成模型能够根据文本描述生成高质量的图像&#xff0c;为创意工作者和各行各业的专业人士提供了全新的工具。本文将深入探讨DA…

Python和C++赋值共享内存、Python函数传址传值、一些其他的遇到的bug

1、Numpy共享内存的情况&#xff1a; array1 np.array([1, 2, 3]) array2 array1 array2[0] 0 # array1也会跟着改变&#xff0c;就地操作 array2 array2 * 2 # array2不会跟着改变&#xff0c;属于非就地操作&#xff0c;会创建一个新的地址给array2array2 array1…

1+x(Java)中级题库易混淆理论题(三)

SQL 语句中进行 group by 分组时&#xff0c;可以不写 where 子句 分组时可以多层分组&#xff0c;比如&#xff1a;先按照省、再按照市来分组。 File 类不能获取文件的内容 在使用 select 语句进行查询分组时&#xff0c;如果希望去掉不满足条件的分组&#xff0c;使用 hav…

C#中实现订单30分钟自动取消的策略

在电子商务或在线预订系统中&#xff0c;订单超时自动取消是一个常见的需求。这种机制可以确保那些长时间未支付的订单不会一直占用系统资源&#xff0c;从而提高系统的效率和可靠性。本文将介绍如何在C#中实现一个订单在30分钟内未支付则自动取消的策略。 一、需求分析 首先…

【前端】JS示例:判断Array()类型的数组里是否存在指定的值,不存在就追加进去

在jQuery中&#xff0c;虽然jQuery主要用于操作DOM和提供丰富的JavaScript库&#xff0c;但它并没有专门用于数组操作的特定函数。然而&#xff0c;你可以使用原生的JavaScript数组方法来检查数组中是否存在某个值&#xff0c;并在不存在时将其添加到数组中。 以下是一个简单的…

高考加油,奥利给

又到了一年一度的高考时刻了啊&#xff0c;高考是漫漫人生路上的一个转折点&#xff0c;祝各位莘莘学子都超常发挥、金榜题名

阿贝云免费虚拟主机和免费云服务器评测

阿贝云是一家提供免费虚拟主机和免费云服务器的云服务提供商。他们的服务非常受用户欢迎&#xff0c;因为他们提供的免费方案相比其他竞争对手来说更具竞争力。用户可以在阿贝云上轻松创建自己的网站&#xff0c;并享受稳定可靠的服务。阿贝云的免费虚拟主机套餐包括免费的域名…

人类语言处理nlp部分笔记——二、BERT和它的家族-介绍和微调

参考自李宏毅课程-人类语言处理 二、BERT和它的家族-介绍和微调 1. What is pre-train model 这里所说的pre-train model是输入一串tokens&#xff0c;能够输出一串vectors&#xff0c;且每个vector可以表示对应的语义的模型&#xff0c;这些vectors也被称作为embeddings。以…

笔记-python爬虫之xpath的基本使用

一、简介 XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素&#xff0c;并且 XQuery 和 XPointer 都构建于 XPath 表达之上。 参照 二、安装 1 pip3 install lxml三、使用 1、导入 1 from lx…

【set】集合总结

一、Set Set集合是Collection的子接口,代表一种集合,此种集合是元素不重复. 有两个常用实现类 HashSet 是元素不重复,无序,主要是指遍历顺序和插入顺序不一致 TreeSet 是元素不重复,排序 LinkedHashSet不常用 二、HashSet 1.1 介绍 HashSet是Set的实现类 底层是由哈希表实…

微信小程序上线后获取定位失效

描述 微信小程序在开发过程中&#xff0c;不论是模拟器还是真机调试都能正常正常获取定位信息 但是上线后异常 解决 ​ 我这里以uniapp开发举例 manifest.json文件中 >> 微信小程序模块 >> 微信小程序权限配置 >> 勾选位置接口&#xff0c;描述必填&#x…

Python数据分析I

目录 注&#xff1a;简单起见&#xff0c;下文中"df"均写为"表名"&#xff0c;"函数"均写为"HS"&#xff0c;"属性"均写为"SX"&#xff0c;"范围"均写为"FW"。 1.数据分析常用开源库 注释…