当前位置: 首页 > news >正文

Mysql--事务

事务

开始之前,让我们先想一个场景,有的时候,为了完成某个工作,需要完成多种sql操作
比如转账在这里插入图片描述
再比如下单
第一步 我的账户余额减少
第二步 商品的库存要减少
第三步 订单表中要新增一项

事务的本质,就是为了把多个操作,打包成一个操作来完成的,让着多个操作要么能全部都执行成功,要么就一个都不执行,这就是原子性
注意一个要点,这里的一个都不执行,不是真的没执行,执不执行成功,得执行了才知道

回滚

假设事务中有三个操作,顺序是先执行1,再执行2,再执行3
真正执行之前,是不知道哪一步会出错的,如果是执行到中间出错了,就需要自动把前面已经成功执行的操作,进行还原,还原到最初没有执行的模样,这个还原数据的过程,叫做回滚(rollback)
本质上,这里的没执行,不是真的没执行,而是看起来就跟没执行一样
回滚是咋实现的呢?
只要把事务中执行的每个操作,都记录下来(此处的记录是通过特定的日志,来记录数据库事务操作的中间过程),如果需要回滚,就直接按照之前操作的“逆操作”来执行就可以了。(上个操作如果是插入,逆操作就是删除),回滚保证了事务的原子性

在这里插入图片描述

事务的使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

start transaction;
-- 小白账户减少2000
update accout set money=money-2000 where name = '小白';
-- 小郭账户增加2000
update accout set money=money+2000 where name = '小郭';
commit;

在这里插入图片描述

事务的基本特性(面试必考)

1.原子性:保证多个操作被打包成一个整体,要么能够全部执行正确,要么就一个都不执行
2.一致性:事务执行之前和事务执行之后,数据能对上
3.持久性:事务这里执行的各种操作,都是持久生效的(最终写入到硬盘中的),一旦事务执行成功了,这里的所有操作产生的修改,都是写到硬盘里的
4.隔离性:并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出权衡,“隔离”描述的是同时执行的事务之间,相互的影响,隔离性越高,并发性越低,数据越可靠,性能就越低
并发执行事务过程中,可能产生以下几种问题
(1).脏读问题
假如我学习很好,在写老师布置的代码作用,我的舍友啥也不会,这时候正好看见我在写作业,于是就过来吵我的,但是最后老师公布成绩的时候,我全对,舍友错了点儿,为什么呢?
是因为舍友抄的是我临时写的代码,我在他抄完了,发现有一部分代码错了,然后修改了,这时候舍友不知道我改了,他提交的是我的旧的代码,我舍友就形成了“脏读”
如何解决脏读问题呢?
给写操作加锁!!
一个事务A写的时候,其他事务不能读了,知道事务A写完并提交数据之后,其他事务才能来读
引入了写加锁,降低了两个事务之间的并发性,提高了隔离性,降低了效率,使数据更准确了
(2).不可重复读
我在这写代码,其他同学想看代码,我跟他们说好了我必须提交到码云之后(这是一个事务),同学们再来读,我写完代码之后提交,这时候同学们正在读
当同学们正在读的时,我继续修改这段代码了(这是另一个事务),修改完毕,我又一个提交
这就导致同学这边读的时候,代码突然就变样了,可能同学们好不容易理解的之前的代码,现在又要重新理解了
在同一个读取数据的事务中,可能会涉及到多次读操作,多个读操作读到的数据可能会不一样
如何应对不可重复读呢?
就是给读操作也加锁!!
给写操作加锁的意思是我在写的时候,别人不能读(除非我写完了提交了,别人才能读),此时,别人读的过程中,我还可以再开启一个新的事务来写,第二个事务提交之前,其他读事务读到的都是旧版本的数据,第二个事务提交之后,别人再读,就是新版本的数据了
给读操作加锁的意思是别人读的时候,我不能写了!进而并发程度又进一步降低了,执行效率也降低了,相反,隔离性进一步提高了,数据可靠性也提高了
(3).幻读
还是我在写代码的时候,和同学们约定
写加锁,我写的时候,提交之前,大家别看
读加锁,同学们读的时候,我不能修改代码
但是我觉得闲着也是闲着,还不如创建一个新的类(假设之前操作的是student类,现在我创建出一个新的teacher类)来编写代码
这样就导致了同学们读者读者,虽然student类没变,但是突然冒出来了一个teacher类
幻读就是一个事务在多次读的过程中,虽然读到的数据是一样的,但是结果集不同,比如第一次读的是十条记录,第二次读的是十一条记录,11条记录中的前十条,和之前的10条是一模一样的,但是多出来一个,幻读可以看成是不可重复读的特殊情况
解决幻读的方法只有一个,就是串行化,彻底放弃并发执行事务,所有的事务的执行都是一个挨着一个的来,这种情况下,并发性是最低的,隔离性是最高的,效率是最低的,数据是最可靠的

四种事务的隔离级别

在这里插入图片描述
大部分情况下,使用第三种默认的隔离级别(RR级别—缩写)就够了!!!

http://www.lryc.cn/news/159385.html

相关文章:

  • 【算法题】小红书2023秋招提前批算法真题解析
  • 序列到序列学习(seq2seq)
  • 基于Java+SpringBoot+Vue摄影分享网站的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】
  • 接口测试系列 —— POSTMAN的简单使用
  • 一个帮各位填秋招表格省一点事的浏览器插件
  • react16之前diff算法的理解和总结
  • JavaEE初阶(1)(冯诺依曼体系、CPU、CPU基本原理、如何衡量CPU的好坏?指令、操作系统、操作系统“内核”)
  • 记录在yapi上传接口的问题
  • DevOps管理软件生命周期
  • 快速解决 adb server version doesn‘t match this client
  • 【更新至2022年】2000-2022年全国31省市以2000年为基期的实际GDP、名义GDP、GDP平减指数数据(含原始数据+计算过程+计算结果)
  • 【LeetCode】剑指 Offer <二刷>(5)
  • rtsp 拉流 gb28181 收流 经AI 算法 再生成 rtsp server (一)
  • Jmeter系列-环境部署、详细介绍、安装目录介绍(1)
  • 更换 yum 阿里源 - 手把手教你怎么配置,在也不需要求别人了 - 看懂一个就相当于看懂了其他的linux系统
  • 966SEO扫地僧站群·万能HTML模板[V1.9.1]
  • angular:html2canvas对ion-avatar节点渲染不正确
  • 使用dockerfile文件部署Python+PyWebIO项目
  • 【web开发】5.Mysql及python代码执行数据库操作
  • Android学习之路(13) Handler详解
  • 介绍一些开发用到的工具
  • 【笔试真题记录】2023滴滴编程第二题
  • 中国ui设计师年终工作总结
  • CSS 滚动驱动动画 scroll()
  • 基于Java+SpringBoot+Vue前后端分离在线考试系统设计和实现
  • nvm管理多个版本的nodejs
  • LeetCode 1658. 将 x 减到 0 的最小操作数
  • Rasa 3.1 机器学习一构建标准的对话
  • MySQL的概述、版本、安装过程
  • leetcode:58. 最后一个单词的长度