MySQL之事务

news2024/11/17 7:19:48

引入事务:

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

那么什么是一个完整的业务逻辑呢?

拿现实生活中的银行业务举例,假设转账,从A账户向B账户中转账10000,将A账户的钱减去10000(update语句),将B账户的钱加10000(update语句),这两步操作结合即为一个完整的业务逻辑。

以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。

只有DML语句[insert,delete,update]才会有事务,其他语句和事务无关

事务机制

当业务只需要一条DML语句就能完成,那么事务就没有存在的价值了,因为正是做某件事时,需要多条DML语句结合才能够完成,才需要事务的存在,事务本质就是多条DML语句同时执行,或者同时失败

事务机制的执行过程:

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

事务开启:

insert
insert
insert
delete
update
update

事务结束!

在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中,在事务的执行过程中,我们可以提交事务,也可以回滚事务

提交事务:

清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中,提交事务标志事务的结束,并且是一种全部成功的结束

回滚事务:

将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着事务的结束,并且是一种全部失败的结束

自动提交机制:

提交事务:commit;语句
回滚事务:rollback;语句[回滚永远都是只能回滚到上一次的提交点]

经过如下测试:

在这里插入图片描述

我们得出,MySQL默认情况下是自动提交事务的,即为每执行一条DML语句,则提交一次

这种自动提交实际上是不符合我们的开发习惯,因为每一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全。必须要求同时成功之后再提交所以不能执行一条就提交一条

关闭自动提交机制:

执行下述语句;

start transaction;

在这里插入图片描述

人为提交事务:

在这里插入图片描述

事务的4个特性:

A:原子性

说明事务是最小的工作单元,不可再分

C:一致性

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

I:隔离性

A事务和B事务具有一定的隔离
教室A和教室B之间有一道墙,所谓个隔离性就是指这道墙,A事务在操作一张表的时候,另一个事务B也操作这张表,相当于多线程并发访问同一张表

而A教室和B教室之间所隔的墙,可以很厚,也可以很薄,这就是事务的隔离级别,这道墙越厚,表示隔离级别越高

事务和事务之间的隔离级别有哪些?

读未提交:

read uncommitted(最低的隔离级别),事务A可以读取到事务B未提交的数据,这种隔离级别存在的问题就是:脏读现象(Dirty Read),即为读到了脏数据,这种隔离级别一般都是理论上的,大多数的数据库隔离级别第二档起步。

验证

查看当前MySQL使用的隔离级别:

8.0以下版本使用该命令:

select @@tx_isolation

在这里插入图片描述

设置隔离级别为read uncommitted

执行下述命令:

set global transaction isolation level read uncommitted;

再次查询:

在这里插入图片描述

验证过程如下:

在这里插入图片描述

读已提交:

read committed,事务A只能读取到事务B提交之后的数据,这种隔离级别避免了读取到脏数据现象但是这种隔离级别不可重复读取数据,也就是说,在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4,称为不可重复读取

这种隔离级别是比较真实的数据,每一次读到的数据是绝对真实的,Oracle数据库默认的隔离级别是:read committed

设置隔离级别为read committed

执行下述命令:

set global transaction isolation level read committed;

再次查询:

在这里插入图片描述

验证过程如下:

在这里插入图片描述

可重复读:

repeatable read,事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的,即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读,它解决了不可重复读取数据的问题,但是它存在会出现幻影读的问题,即为每一次读取到的数据都是幻象,不够真实

设置隔离级别为repeatable read

执行下述命令:

set global transaction isolation level repeatable read;

再次查询:

在这里插入图片描述

验证过程如下:

在这里插入图片描述

举例:

早晨9点开启了事务,只要事务不结束,到晚上9点,读取到的数据还是那样,读到的都是假象。不够绝对的真实

MySQL中默认的事务隔离级别即为它

序列化/串行化:

serializable(最高的隔离级别),这是最高隔离级别,效率最低,解决了所有的问题,这种隔离级别表示事务排队,不能并发,synchronized,线程同步(事务同步),每一次读取到的数据都是最真实的,并且效率是最低的`

设置隔离级别为serializable

执行下述命令:

set global transaction isolation level serializable;

再次查询
在这里插入图片描述

验证过程如下:

在这里插入图片描述
D:持久性

事务最终结束的一个保障—>事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上

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

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

相关文章

Redis:一、简介

Redis 1. redis的简介 1.1 NoSQL的介绍 在介绍redis之前,我们先来了解一下NoSQL(Not only SQL),不仅仅是SQL。 NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别…

Cache(缓存)基本概念

cache的概念在计算机中被广泛应用,包括TLB等都使用了它的理念,因此对其进行总结。Cache——位于CPU上,处于寄存器和内存之间的存储单元。 Cache Hit & Miss在写入cache的时候,有hit(命中)和miss&#x…

基于ros1的 apollo 7.0.0规划控制算法

apollo.ros-7.0.0 上次给大家带来了之前学习apollo时开发的内容apollo.ros-1.0.0和apollo.ros-3.0.0,主要是针对apollo 1.0.0和3.0.0版本进行了ros1下的移植和规划控制算法的学习。本次在之前工作的基础上,针对apollo 7.0.0版本,进行了ros1下…

植物大战僵尸:分析植物的攻击速度

植物大战僵尸中,植物是有攻击速度的,比如每隔一段时间会吐出一些子弹,那么由此可判断吐出子弹应该是由一个计数器控制的,也就是说只要我们能够找到控制植物攻击的时钟并改写它,也就可以实现植物的无限吐子弹。 吐出子…

数据结构---二叉树

坚持看完,结尾有思维导图总结 这里写目录标题什么是二叉树?二叉树的定义二叉树的性质二叉树的基石在哪里?总结什么是二叉树? 二叉树的定义 二叉树,就是从一个根开始,按照两边分支的方式向下生长的树,就能…

python虚拟环境的概念,用法(pycharm)

1.在PyCharm中创建python项目时,需要配置python的运行环境,除了使用系统现有环境以外,还可以创建虚拟环境。 2.虚拟环境的创建是因为在实际开发中需要同期用到不同版本的python解释器,不同的第三方库以及同一个第三方库的不同版本…

Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)

一、前言 最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右&#…

高级前端二面手写面试题(边面边更)

解析 URL Params 为对象 let url http://www.domain.com/?useranonymous&id123&id456&city%E5%8C%97%E4%BA%AC&enabled; parseParam(url) /* 结果 { user: anonymous,id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字…

四【Servlet基础】文件配置及环境搭建(重要)

文章目录4.1 Servlet概念4.2 Servlet作用4.3 Servlet开发步骤4.3.1 搭建开发环境4.3.2 创建项目4.3.3 部署Servlet4.3.4 配置Servlet4.3.5 测试运行4.1 Servlet概念 (1)Servlet:Server Applet的简称,是运行在Web服务器端的Java程…

GDB无法debug的错误

GDB无法debug的错误 一、输出错误信息描述 Warning: opening /proc/PID/mem file for lwp 707.707 failed: No such file or directory (2) Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x806950 二、解决方法 方法:修改 GDB 的二进…

spring之IoC注解(三)负责注入的注解

文章目录前言一、Value注解Product类spring配置文件测试程序运行结果二、Autowired与Qualifier注解1.创建OrderDao接口2.创建OrderDao接口实现类3.创建OrderService类4.配置文件5.测试程序6.运行结果三、Resource注解(重要)1、创建StudentDao接口2、创建…

皮带断裂识别检测系统 opencv

皮带断裂识别检测系统通过opencv深度学习yolo计算机视觉识别技术对皮带运行状态进行全天候实时监测,当识别到皮带断裂撕裂时立即抓拍告警存档。OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。OpenCV-Python使用Numpy,这是一个高度…

LeetCode刷题复盘笔记—一文搞懂动态规划之392. 判断子序列问题(动态规划系列第三十八篇)

今日主要总结一下动态规划的一道题目,392. 判断子序列 题目:392. 判断子序列 Leetcode题目地址 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除&a…

08 LIN

基础知识 LIN的全称为Local Interconnect Network。LIN主要功能是为CAN总线网络提供辅助功能,应用场合有智能传感节点、自动车窗节点等。 硬件 特点 1.采用单主多从的组网方式,无CAN总线那样的仲裁机制,最多可连接16个节点(1主…

大数据技术——HBase安装配置DDLDML操作

HBase文章目录1. HBase 安装1.1 HBase下载1.2 HBase安装1.3 HBase 初始配置2. 配置高可用并且群起集群2.1 HBase高可用2.2 群起集群2.3 进入HBase客户端3. DDL&DML操作3.1 DDL操作3.2 DML操作1. HBase 安装 1.1 HBase下载 HBase下载官方网站直达 选择自己需要的版本&…

Allegro孔和线被做到器件里面如何解锁操作指导

Allegro孔和线被做到器件里面如何解锁操作指导 在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。如下图 具体操作如下 选择Route选择Convert Fanout

Acwing 796子矩阵的和

Acwing 796子矩阵的和 前缀和 更新 (前缀和数组):s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j] 查询(x1,y1)-------(x2,y2)矩阵的元素和 Ss[x2][y2]-s[x-1][y2]-s[x2][y1-1]s[x1-1][y1-1] 输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每…

QML教程(二)视觉对象

目录 一、矩形类型:Rectangle 二、图像类型:Image 三、基类类型:Item 一、矩形类型:Rectangle 矩形是最基本的视觉效果,Qt Quick提供了一个矩形类型来绘制矩形。这些矩形可以用颜色或垂直渐变着色。矩形类型还可以在…

【Linux】进程程序替换及shell的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉进程程序替…

Mybatis-Plus 映射匹配兼容性

目录 问题一:表字段与编码属性设计不同步 问题二:编码中添加了数据库中未定义的属性 问题三:采用默认查询开放了更多的字段查看权限 TableField 问题四:表名与编码开发设计不同步 TableName 从表中查询出数据,并…