草庐IT

MYSQL学习笔记之事务

ITWEL 2023-03-28 原文

(一)什么是事务??

事务其实就是一个完整的业务逻辑,不可再分,是一个最小的工作单元。

准确来说,一个事务就是批量的DML语句同时成功或者同时失败。

说明:只有DML语句与事务有关系,其他语句与事务无关

DML语句: insert、delete、update语句(对数据库表中的数据进行操作)

(二)存在原因

   在处理某中业务的时候,需要多条DML语句共同联合起来才能完成

(三)如何保持?

  InnoDB存储引擎:提供一组用来记录事务性活动的日志文件。

 在事务执行的过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。

 在事务执行的过程中,即可以提交事务,也可以回滚事务。

提交事务??(commit; 语句 )

  清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中

  提交事务标志着事物的结束,并且是一种全部成功的结束。

回滚事务??(rollback;语句---->上一次提交<commit>的位置 )

    将之前的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着

事务的结束,并且是一种全部失败的结束。

mysql默认情况下是支持自动提交的(执行一次sql语句,就执行一次)

缺点:一个完整的业务是需要经过多条DML语句共同执行才可能完成,为了保证数据的安全,必须要求同时成功之后再提交,

所以要关闭这种默认自动提交机制。

如何关闭呢??

命令:start transaction;

#------------------------------回滚事务-----------------------------------

mysql> select * from flower;
Empty set (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into flower(name)values('玫瑰');
Query OK, 1 row affected (0.00 sec)

mysql> insert into flower(name)values('月季');
Query OK, 1 row affected (0.00 sec)

mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
+------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from flower;
Empty set (0.00 sec)
#-----------------------提交事务----------------------------

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into flower(name)values('玫瑰');
Query OK, 1 row affected (0.00 sec)

mysql> insert into flower(name)values('月季');
Query OK, 1 row affected (0.00 sec)

mysql> insert into flower(name)values('牡丹');
Query OK, 1 row affected (0.00 sec)

mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
| 牡丹 |
+------+
3 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
| 牡丹 |
+------+
3 rows in set (0.00 sec)

(四)事务特性

I.原子性: 指的是事务的最小工作单元,不可再分。

II.一致性:所有事务要求,在同一个事务中,所有的操作必须同时成功,或者同时失败,以保证数据的一致性。

III.隔离性:是针对数据资源的并发访问,规定了各个事务之间相互影响的程度。

IV.持久性: 事务最终结束的一个屏障。事务提交,就相当于没有保存到硬盘上的数据保存到硬盘上。

补充:

事物之间的隔离性

A、B教室中间有一道墙,根据墙的厚薄,可以分为不同的级别

事务与事务之间也存在一定的级别,具体分类如下:

(1)读未提交: read uncommitted(最低的隔离级别)

             基本介绍:事务A可以读取到事务B未提交的数据。

            存在问题:脏读现象(dirty read)

(2)读已提交: read committed<oracle默认的隔离级别>

           基本介绍:事务A只能读取到事务B提交之后的数据。

          存在问题:不可重复读取数据(由于事务B并未完全提交导致事务A读取的时候只能读取到提交的数据)

          特点:读到的数据比较真实

(3)可重复读:repeatable read<读取不到提交之后的数据,永远读取的都是开启事务时的数据>

          基本介绍:事务A开启之后,每一次在事务A中读取到的数据都是一致的(即使事务B的数据已经修改,事务A读取到的数据还是不会改变)

   存在问题: 幻影读(每次读取的数据都是幻影,不够绝对的真实)


(4) 序列化/串行化: serializable(最高的隔离级别)

           隔离级别最高,效率最低,解决了所有的问题,表示事务排队,不能并发。

(五)实践验证

查看默认隔离级别:

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)
验证: read uncommitted

mysql>set gloabl transaction isolation level read uncommitted;

                     事务A                                                 事务B  

----------------------------------------------------------------------------                use bjpowernode;                                                                                                                                                           use bjpowernode;

             start transaction;

             select * from t_user;

                                                                             start transaction;

                                                               insert into t_user values('zhangsan')

             select * from t_user;      

结果:事务B插入后,可以在事务A中查到,在事务B<rollback>后就在事务A中查不到了

--------------------------------------------------------------------------------------

验证:read committed

mysql>set gloabl transaction isolation level read committed;

                     事务A                                                 事务B

----------------------------------------------------------------------------

        use bjpowernode;

                                                                               use bjpowernode;

        start transaction;

                                                                               start transaction;

       select * from t_user;

                                                              insert into t_user values('zhangsan');

       select * from t_user;                                     

                                                                              commit;

       select  * from t_user;

-------------------------------------------------------------------------------------

验证:repetable read

mysql>set gloabl transaction isolation level  repeatable read;

                     事务A                                                 事务B

----------------------------------------------------------------------------

       use bjpowernode;

                                                                               use bjpowernode;

        start transaction;

                                                                               start transaction;

       select * from t_user;

                                                              insert into t_user values('zhangsan');

                                                                insert into t_user values('lisi');

       select * from t_user;

结果:事务A查到的结果一直没变,与丝毫不受事务B的任何影响。

----------------------------------------------------------------------------

 验证:serializable  

mysql>set gloabl transaction isolation level  serializable;

                     事务A                                                 事务B

---------------------------------------------------------------------------

       use bjpowernode;

                                                                               use bjpowernode;

        start transaction;

                                                                               start transaction;

       select * from t_user;

       insert into t_user values('fei');                         

                                                                              select * from t_useer;(一致等待,除非事务A提交) 

结果:事务A和事务B不能同时操作同一个表,会有一个先后顺序。

优秀博文:

https://baijiahao.baidu.com/s?id=1709428402761709469&wfr=spider&for=pc



有关MYSQL学习笔记之事务的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  6. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  7. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  8. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  9. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  10. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

随机推荐