Mysql--事务

news/2024/10/21 14:34:53/

事务

开始之前,让我们先想一个场景,有的时候,为了完成某个工作,需要完成多种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.ppmy.cn/news/1097793.html

相关文章

ntpd 和ntpdate 的区别

ntpd 和 ntpdate 都是用于进行网络时间同步的工具,但在功能和使用方式上有所不同。 ntpd(Network Time Protocol daemon)是 NTP 守护进程,用于在计算机网络中持续同步系统时钟与全球标准时间。ntpd 可以在计算机启动时自动启动&a…

thinkphp开启定时任务的三种办法(最全)

第一种方法 使用think-cron类库 //composer 安装 composer require yunwuxin/think-cron github文档地址 https://github.com/yunwuxin/think-cron 1.创建任务类 <?php namespace app\task; use yunwuxin\cron\Task; class DemoTask extends Task { public function …

826. 安排工作以达到最大收益;2257. 统计网格图中没有被保卫的格子数;816. 模糊坐标

826. 安排工作以达到最大收益 核心思想&#xff1a;排序维护最大利润。首先我们需要对工人按照能力排序&#xff0c;前面工人满足的最大利润后面的工人肯定是满足的&#xff0c;所以我们只需要用一个tmp来维护小于等于当前工人的最大利润&#xff0c;然后如何得到tmp&#xff…

【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)

目录 一、前言 二、实验环境 三、Python基本数据类型 3. 字符串&#xff08;Strings&#xff09; 1. 初始化 2. 索引 3. 切片 4. 运算 a. 拼接运算 b. 复制运算 c. 子串判断 d. 取长度 5. 格式化 a. 使用位置参数 b. 使用关键字参数 c. 使用属性访问 f-string…

Python中的Pathlib

迷途小书童 读完需要 4分钟 速读仅需 2 分钟 大家好&#xff0c;我是迷途小书童&#xff01; 今天给大家介绍 Python 中的内置库 Pathlib。 pathlib 模块是 Python 3.4 中新增的标准库&#xff0c;它提供了面向对象的文件系统路径处理方法。pathlib 致力于解决直接操作文件路径…

【猿灰灰赠书活动 - 05期】- 【速学Linux:系统应用从入门到精通】

&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;博文为大家争取福利&#xff0c;与机械工业出版社合作进行送书活动 &#x1f468;‍&#x1f…

代码随想录算法训练营第三十八天 | ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

题目链接&#xff1a;509. 斐波那契数 代码随想录 视频&#xff1a;手把手带你入门动态规划 | LeetCode&#xff1a;509.斐波那契数_哔哩哔哩_bilibili 看完代码随想录之后的想法&#xff1a; 我们要知道动态规划的五部曲&#xff1b; 1&#xff0c;确定dp数组的含义&#x…

MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)

老生长谈&#xff0c;MySQL具有开源、支持多语言、性能好、安全性高的特点&#xff0c;广受业界欢迎。 在数据爆炸式增长的年代&#xff0c;掌握一种数据库能够更好的提升自己的业务能力&#xff08;实施工程师&#xff09;。 此系列将会记录我学习和进阶SQL路上的知识&#xf…