Mysql进阶(二)之事务篇

news2024/11/24 15:20:37

文章目录

  • 面试题
  • 事务
    • 1.概念
    • 2.事务的四大特性ACID
    • 3.操作
  • 并发事务问题
    • 1.脏读
    • 2.不可重复读
    • 3.幻读
  • 事务隔离级别(解决并发问题)
  • 事务的原理
    • 1.redo log(重做日志)
    • 2.undo log(回滚日志)
    • 3.MVCC(多版本并发控制)

面试题

1.并行事务会引发什么问题?
2.事务有哪几个特性?
3.事务的原理/事务的特性是怎么实现的?
4.事务的隔离级别有哪些?

事务

1.概念

数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令

事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败

事务是一个不可分割的工作逻辑单元。

语法:

操作含义
开启事务START TRANSACTION 或 BEGIN ;
提交事务COMMIT;
回滚事务ROLLBACK

默认MySQL的事务是自动提交的,当执行完一条DML语句时,MySQL会立即隐式的提交事务。(当执行上面开启事务语句时,需手动提交事务)

2.事务的四大特性ACID

  • 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态(比如转账问题中事务开启前的金钱总额和开启后的金钱总额要一致)

  • 隔离性(Isolation):(由于数据库允许多个并发事务同时对其数据进行读写和修改的能力),数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

3.操作

最经典的例子就是转账问题,如果张三和李四的账户各有1000块钱,现在李四给张三账户转账500,那么转账成功张三账户应该是1500,李四账户是500.

但是如果没有开启事务,在整个操作中发生了异常,就会导致李四转账操作成功,但是张三账户增加操作没成功

从代码角度理解:
(1)先是正常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

(2)异常情况(转账中出现异常情况)

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
出错了....
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

此时第三个语句因为前面“出错了……”这句异常导致没有执行,所以最后的结果就是不成功的。

(3)所以要利用事务

-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错, 则回滚事务
-- rollback;

出现异常的时候,回滚事务后,就可以恢复,如下图所示:

在这里插入图片描述

并发事务问题

MySQL 服务端是允许多个客户端连接的,这意味着 MySQL 会出现同时处理多个事务的情况。也就有一系列问题。

1.脏读

一个事务读到另外一个事务还没有提交的数据。
在这里插入图片描述

解释:
一个事务读取数据并且对数据进行了修改,这个修改对其他事务来说是可见的,即使当前事务没有提交。这时另外一个事务读取了这个还未提交的数据,但第一个事务突然回滚,导致数据并没有被提交到数据库,那第二个事务读取到的就是脏数据

例如:事务 1A读取某表中的数据 A=20,事务 1 修改 A=A-1,事务 2 读取到 A = 19,事务 1 回滚导致对 A 的修改并为提交到数据库, A 的值还是 20。

2.不可重复读

一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
在这里插入图片描述
一个事务先后读取同一条记录,但两次读取的数据不同。事务2两次读取同一条记录,但是读取到的数据却是不一样的

3.幻读

一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。

在这里插入图片描述
那么怎么解决这些并发事务呢,引出下面的事务隔离级别

事务隔离级别(解决并发问题)

主要是下面四种隔离级别:读未提交,读已提交,可重复读,可串行化
在这里插入图片描述
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)(也就是说可以避免脏读和不可重复读)

注意:事务隔离级别越高,数据越安全,但是性能越低。

语法:

操作含义
SELECT @@TRANSACTION_ISOLATION;查看事务隔离级别
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }设置事务隔离级别

事务的原理

那么InnoDB 引擎通过什么技术来保证事务的这四个特性的呢?

持久性是通过 redo log (重做日志)来保证的;
原子性是通过 undo log(回滚日志) 来保证的;
隔离性是通过 MVCC(多版本并发控制) + 锁机制来保证的;
一致性则是通过持久性+原子性+隔离性来保证;

1.redo log(重做日志)

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。

2.undo log(回滚日志)

回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚(保证事务的原子性) 和MVCC(多版本并发控制) 。

undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的 update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚

3.MVCC(多版本并发控制)

维持一个数据的多个版本,使得读写操作没有冲突。用来解决读-写冲突的无锁并发控制

(1)基本概念

当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select … lock in share mode(共享锁),select …for update、update、insert、delete(排他锁)都是一种当前读。

快照读
简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

(2)隐藏字段

在这里插入图片描述
(3)undo log 版本链

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条
记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

在这里插入图片描述

(4)ReadView
ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

包含四个核心字段:

在这里插入图片描述

而在readview中就规定了版本链数据的访问规则:trx_id 代表当前undolog版本链对应事务ID。

在这里插入图片描述

(5)实现原理

不同的隔离级别,生成ReadView的时机不同:

  • READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
  • REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView(所以最终快照读返回的结果也是一样的。)

参考链接:https://javaguide.cn/database/
https://www.bilibili.com/video/BV1Kr4y1i7ru?p=145&vd_source=752a4cd440b20a1953dc8d254ef99696

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

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

相关文章

最优化问题matlab求解-fminsearch()和fmincon()函数的使用

matlab可以求解无约束最优化问题、有约束最优化问题和线性规划、二次型规划问题等,同时实现了最小二乘法的曲线拟合方法。matlab求解优化问题的步骤为: 写标准型描述目标函数:M-函数或匿名函数用fminunc()或fmincon()等函数求解原问题。检验…

centos openssl升级

centos openssl升级 一、下载二、(升级)安装 一、下载 执行命令下载: wget https://www.openssl.org/source/openssl-1.1.1f.tar.gz浏览器下载,访问官网网址:https://www.openssl.org/source (1&#xff0…

汇编语言基础--nasm语法数据类型

dd //define 一个字节 例如:dd 100 dw //define 一个字 也就是两个字节 例如:dw 0xaa55 db //define 双字 也就是4个字节 例如:db 0x12345678 由于intel x86的架构采用小端存储因此二进制序列如下: 如果是16进制在后面输入h …

C++ 数据结构图(1)

1. 图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E) &#xff0c;其中&#xff1a; 顶点集合 V {x|x 属于某个数据对象集 } 是有穷非空集合 &#xff1b; E {(x,y)|x,y 属于 V} 或者 E {<x, y>|x,y 属于 V &&…

【Spring Boot 事务】万字详解Spring Boot 事务,赶快跟随良辰一起去学习Spring Boot 事务吧! ! !

前言: 大家好,我是良辰丫,这篇文章我将带领大家一起去学习Spring Boot 事务文章,我们在学习数据库的时候已经接触过事务了,来跟随我的脚步一起来瞧一下Spring Boot 事务吧.&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;…

得物社区推荐精排模型演进

1.背景 得物社区是一大批年轻人获取潮流信息、分享日常生活的潮流生活社区。其中用户浏览的信息&#xff0c;进行个性化的分发&#xff0c;是由推荐系统来决策完成的。目前得物社区多个场景接入了推荐算法&#xff0c;包括首页推荐双列流、沉浸式视频推荐、分类tab推荐流、直播…

Tomcat的安装部署及优化

tomcat安装部署 tomcat安装部署 一、概述&#xff1a;1.tomcat介绍&#xff1a;2.tomcat核心组件&#xff1a;3.tomcat处理内部请求&#xff08;数据流向图&#xff09;4.tomcat服务部署&#xff1a; 二、虚拟主机配置&#xff1a;1.创建 chan 和 baek 项目目录和文件&#xf…

Python常见的开发工具合集对比

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

BurpSutie拓展插件推荐-漏洞扫描插件

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 fastjsonScan&#xff08;1&#xff09;工具介绍&#xff08;2&#xff09;下载地址&#xff08;3&#xff09;使用说明 02 SpringScan&#xff08;1&#xff09;工具介绍&#xff08;2&#xff09…

python接口自动化(十三)--cookie绕过验证码登录(详解)

简介 有些登录的接口会有验证码&#xff1a;短信验证码&#xff0c;图形验证码等&#xff0c;这种登录的话验证码参数可以从后台获取的&#xff08;或者查数据库最直接&#xff09;。获取不到也没关系&#xff0c;可以通过添加cookie的方式绕过验证码。&#xff08;注意&#x…

GPT模型训练实践(1)-基础概念

GPT 是 Generative Pre-trained Transformers 的缩写&#xff0c;一种先进的深度学习模型&#xff0c;旨在生成类人文本。GPT 的三个组成部分Generative、Pre-trained 和 Transformer&#xff0c;其解释如下&#xff1a; Generative生成&#xff1a;生成模型是用于生成新数据的…

【DASOU视频记录】Transformer从零详细解读

文章目录 来源transformer的全局理解位置编码多头注意力机制残差Batch NormalLayer NormalDecoder 来源 b站链接 transformer的全局理解 输入中文&#xff0c;输出英文 细化容易理解的结构&#xff0c;就是先编码&#xff0c;再解码 进一步细化的结构&#xff0c;就是多个编…

Python_闭包

目录 1.概念介绍 2.闭包初探 3.闭包陷阱 4.闭包的应用 4.1 潜在的问题 5.闭包的实现 闭包并不只是一个python中的概念&#xff0c;在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包&#xff0c;另一方面可以好好体会和思考闭包的设计思想。…

面试又问到:工作中发现的最有价值的bug?答不好offer要飞了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 这个问题&#xf…

SpringBoot--超时熔断器

需求背景 如果一个服务中有很多涉及需要服务间熔断的地方&#xff0c;就会出现N多下述代码&#xff1a; 1.N个fegnClient接口 FeignClient(name "hello-world-service", fallback HelloWorldFallback.class) public interface HelloWorldService {GetMapping(&q…

gma 2 教程(一)概述:3. 探索 GMA

组织方式 gma 整体按照库-模块-类/函数-&#xff08;方法/属性/子类&#xff09;的思路构建&#xff0c;详细思路如下所示&#xff1a; 整体架构 gma内主要模块与功能对应关系见下表&#xff1a; 模块名中文名对应主要功能io输入输出栅格/矢量数据输入输出模块crs坐标系统坐…

vim的使用方法及相关按键

目录 一、安装vim 二、vim的使用 1.打开vim 2.vim的四种模式使用 &#xff08;1&#xff09;命令模式&#xff08;快捷键的使用&#xff09; &#xff08;2&#xff09;编辑模式 &#xff08;3&#xff09;末行模式 &#xff08;4&#xff09;可视化模式 一、安装vim …

022:vue中tree结构数据变成扁平化table结构数据的示例

第022个 查看专栏目录: VUE — element UI vue在使用element UI tree的时候,有的时候是要做逆向处理的,即将树形结构的数据转化为table结构的数据,即扁平化的json数据。 如何处理呢? 效果图 原始tree结构数据: let newdata= [ {

redis pipeline

redis 执行多条连续的命令的时候为了减少网络开销RTT&#xff0c;可以使用pipeline技术。 pipeline 与 原生批命令(mset, mget) 对比&#xff1a; 原生批命令是原子性&#xff0c;pipeline是非原子性 (原子性概念:一个事务是一个不可分割的最小工作单位,要么都成功要么都失败…

基于Anime2Sketch算法那将图片转成素描

1.下载源码地址 https://github.com/Mukosame/Anime2Sketch下载项目依赖包&#xff0c;下载模型权重文件 运行看效果 python test.py --datarootE:\01_hjz\datas\00-hjz\pictures --load_size512调整自定义测试图片路径 """Test script for anime-to-sketch…