【Mysql】第十一章 事务-重点(原子性+持久性+隔离性+一致性)

news2024/9/25 3:27:14

文章目录

  • 一、概念
    • 1.查看事务支持版本-show engines
    • 2.事务提交方式-show variables like 'autocommit'
    • 3.事务常见操作方式
      • 1.将mysql的默认隔离级别设置成==读未提交==,方便看到实验现象
      • 2.需要重启终端,进行查看隔离级别
      • 3.创建一个银行用户表
      • 4.演示 - 证明事务的开始与回滚
      • 5.演示原子性 - 证明未commit,客户端崩溃,MySQL自动会回滚
      • 6.演示持久性-证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化
      • 7.演示begin会自动更改提交方式为手动,不管autocommit是不是自动提交
      • 8.演示证明单条 SQL 与事务的关系
      • 9.重要总结
  • 二、事务的隔离级别
    • 查看与设置隔离级别
    • 读未提交-read uncommitted
    • 读提交-read committed
    • 可重复读-repeatable read
    • 串行化-serializable
    • 总结
  • 三、一致性
  • 四、多版本并发控制
    • 记录中的3个隐藏字段
    • undo日志
    • 快照
    • Read View


一、概念

事务由一条或多条SQL语句组成的一个整体,事务本质是能够简化我们的编程模型。

  • 原子性: 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,则会自动回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 持久性: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
  • 隔离性: 隔离性可以保证多个事务在并发执行时,不会因为由于交叉执行而导致数据的不一致。
  • 一致性: 在事务开始之前和事务结束以后,数据库的完整型没有被破坏。

原子性,持久性,隔离性是手段,一致性是目的

1.查看事务支持版本-show engines

show engines;

2.事务提交方式-show variables like ‘autocommit’

查看事务提交方式,ON表示打开自动提交,OFF表示关闭自动提交(开启手动提交)

show variables like 'autocommit';

设置事务的提交方式

set autocommit=0;//关闭自动提交.开启手动提交
set autocommit=1;//打开自动提交

3.事务常见操作方式

1.将mysql的默认隔离级别设置成读未提交,方便看到实验现象

set global transaction isolation level read uncommitted;

2.需要重启终端,进行查看隔离级别

quit退出重新登陆
select @@tx_isolation;

3.创建一个银行用户表

create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

4.演示 - 证明事务的开始与回滚

  • 使用begin 或 start transaction命令,可以启动一个事务。

  • 使用savepoint 保存点,可以在事务中创建指定名称的保存点。

  • 使用rollback to 保存点,可以让事务回滚到指定保存点。

  • 使用rollback命令,可以直接让事务回滚到最开始。

  • 使用commit命令,可以提交事务,提交事务后就不能回滚了。

start transaction;//启动一个事务或者begin
savepoint save1; //创建一个保存点save1
insert into account values (1, '张三', 100);//插入一条记录
savepoint save2;//创建一个保存点save2
insert into account values (2, '李四', 10000);//插入一条记录
rollback to save2; //回滚到保存点save2,此时表中只有张三的数据
rollback;//回滚在最开始,所有数据都没有了

5.演示原子性 - 证明未commit,客户端崩溃,MySQL自动会回滚

begin;//启动一个事务或者start transaction
insert into account values (1, '张三', 100);//插入一条记录
quit;//断开连接,mysql会自动让事务回滚到最开始,看不到任何记录

6.演示持久性-证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化

begin;//启动一个事务或者start transaction
insert into account values (1, '张三', 100);//插入一条记录
commit;//提交事务
quit;//断开连接,仍然可以看到之前插入的记录

7.演示begin会自动更改提交方式为手动,不管autocommit是不是自动提交

//假如本来有张三的数据
set autocommit=1;//打开自动提交
begin;//启动一个事务或者start transaction
insert into account values (2, '李四', 10000);//插入一条记录
quit;//断开连接,mysql会自动让事务回滚到最开始,表中只有张三的数据

8.演示证明单条 SQL 与事务的关系

//假如本来有张三的数据
set autocommit=1;//打开自动提交
insert into account values (2, '李四', 10000);//插入一条记录
quit;//断开连接,mysql已经自动提交,表中有张三和李四两个人的数据

9.重要总结

  • 输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,否则会回滚,与是否设置autocommit无关
  • 没用begin或者start transaction,只要设置autocommit=1(自动提交),退出会自动保存
  • 没用begin或者start transaction,只要设置autocommit=0(手动提交),必须要通过commit提交,才会持久化

二、事务的隔离级别

数据库为了保证事务执行过程中尽量不受干扰,于是出现了隔离性的概念

  • 读未提交(read uncommitted): 在该隔离级别下,所有的事务都可以看到其他事务没有提交的执行结果,实际生产中不可能使用这种隔离级别,因为这种隔离级别相当于没有任何隔离性,会存在很多并发问题,如脏读、幻读、不可重复读等。

  • 读提交(read committed): 该隔离级别是大多数数据库的默认隔离级别,但它不是MySQL默认的隔离级别,它满足了隔离的简单定义:一个事务只能看到其他已经提交的事务所做的改变,但这种隔离级别存在不可重复读和幻读的问题。

  • 可重复读(repeatable read): 这是MySQL默认的隔离级别,该隔离级别确保同一个事务在执行过程中,多次读取操作数据时会看到同样的数据,即解决了不可重复读的问题,但这种隔离级别下仍然存在幻读的问题。

  • 串行化(serializable): 这是事务的最高隔离级别,该隔离级别通过强制事务排序,使之不可能相互冲突,从而解决了幻读问题。它在每个读的数据行上面加上共享锁,但是可能会导致超时和锁竞争问题,这种隔离级别太极端,实际生成中基本不使用。

查看与设置隔离级别

查看全局隔离级别

select @@global.tx_isolation;

查看会话隔离级别

select @@tx_isolation;

设置会话隔离级别

set session transaction isolation level 隔离级别;

设置全局隔离级别

set global transaction isolation level 隔离级别;

读未提交-read uncommitted

左终端右终端
设置隔离性,并查看
set session transaction isolation level read uncommitted;
select @@tx_isolation;
设置隔离性,并查看
set session transaction isolation level read uncommitted;
select @@tx_isolation;
begin;//启动一个事务或者start transactionbegin;//启动一个事务或者start transaction
插入一条记录,此时没有提交,在右终端有数据
insert into account values (1, ‘张三’, 100);
select * from account;//表中没有数据
select * from account;//表中有数据

注意:一个事务在执行中,读到另一个执行中事务的更新但是未commit的数据,这种现象叫做脏读

读提交-read committed

左终端右终端
设置隔离性,并查看
set session transaction isolation level read committed;
select @@tx_isolation;
设置隔离性,并查看
set session transaction isolation level read committed;
select @@tx_isolation;
begin;//启动一个事务或者start transactionbegin;//启动一个事务或者start transaction
插入一条记录,此时没有提交,在右终端没有数据
insert into account values (1, ‘张三’, 100);
select * from account;//表中没有数据,创建read view
commit;//提交事务select * from account;//表中有数据,创建新read view

注意:一个事务在执行过程中,两个相同的select查询得到了不同的数据,这种现象叫做不可重复读,中间没用commit

在可重复读隔离级别下,一个事务在执行过程中,相同的select查询得到的是相同的数据,这就是所谓的可重复读

事务每次进行快照读时都会创建一个Read View(使用select),所以RC级别是不可重复读的

可重复读-repeatable read

左终端右终端
设置隔离性,并查看
set session transaction isolation level repeatable read;
select @@tx_isolation;
设置隔离性,并查看
set session transaction isolation level repeatable read;
select @@tx_isolation;
begin;//启动一个事务或者start transactionbegin;//启动一个事务或者start transaction
插入一条记录,此时没有提交,在右终端没有数据
insert into account values (1, ‘张三’, 100);
select * from account;//表中没有数据,创建read view
commit;//提交事务select * from account;//表中没有数据,使用之前的read view
commit;//提交事务
select * from account;//表中有数据,创建新read view

注意:一个事务在执行过程中,相同的select查询得到了新的数据,如同出现了幻觉,这种现象叫做幻读。中间用commit

事务在第一次快照会创建一个Read View(使用select)之后快照会使用最开始的Read View判断,所以之后的修改不可见,只会创建一次Read View,所以RR级别是可重复读的

串行化-serializable

左终端右终端
设置隔离性,并查看
set session transaction isolation level serializable;
select @@tx_isolation;
设置隔离性,并查看
set session transaction isolation level serializable;
select @@tx_isolation;
begin;//启动一个事务或者start transactionbegin;//启动一个事务或者start transaction
插入一条记录,此时没有提交,左终端被阻塞
insert into account values (1, ‘张三’, 100);
左终端被阻塞
当右终端commit后左终端insert才会提交commit;//提交事务

总结

隔离级别脏读不可重复读幻读加锁读
读未提交(read uncommitted)不加锁
读已提交(read committed)X不加锁
可重复读(repeatable read)XXX不加锁
可串行化(serializable)XXX加锁

三、一致性

  • 事务在执行中发生错误,则自动回滚到事务最开始的状态,即一致性需要原子性来保证。

  • 事务处理结束后,对数据的修改必须是永久的,即一致性需要持久性来保证。

  • 多个事务同时访问同一份数据时,必须保证这多个事务在并发执行时,不会因为由于交叉执行而导致数据的不一致,即一致性需要隔离性来保证。

四、多版本并发控制

多版本并发控制,要依赖记录中的3个隐藏字段、undo日志和Read View实现

记录中的3个隐藏字段

  • DB_TRX_ID:6字节,记录最近一次修改事务的ID。
  • DB_ROW_ID:6字节,隐含的自增ID(隐藏主键)。
  • DB_ROLL_PTR:7字节,回滚指针,指向这条记录的上一个版本。

image-20240804132128368

插入该记录的事务的事务ID为9,插入的第一条记录,DB_ROW_ID字段填的就是1,没有历史版本,所以回滚指针DB_ROLL_PTR的值设置为null

undo日志

undo log:回滚日志,是内存缓冲区。

快照

image-20240804143609992

原本undo缓冲区中只有ID为9的张三,现在插入一个李四,所以ID自增1,回滚指针指向张三,现在修改李四所以ID自增1,回滚指针只想原来的李四,undo log中的一个个的历史版本就称为一个个的快照。

Read View

录并维护系统当前活跃的事务ID,select时会生成read view


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

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

相关文章

【Transformer】关于RNN以及transformer的相关介绍

文章目录 RNNTransformer是干什么的?什么是 Word Embedding ?什么是 Word2vec ?CBOW(Continuous Bag-of-Words Model)Skip-gram(Continuous Skip-gram Model)Word2vec 的优缺点 Transformer整体架构注意力机制self-attention(自注…

生成式人工智能助力6G核心技术

崔曙光 加拿大皇家科学院 加拿大工程院双院院士 主要工作:适配改造人工智能算法,来满足通信网络性能 从基础LLM到专用LLM:四个必须面对的问题 如何选择合适的基础LLM规模如何让基础LLM读懂专用领域信息如何避免基础LLM的幻觉现象&#xf…

第9天 xxl-job

使用xxl-job需要建表 引入依赖 添加配置 Bean public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJo…

sql注入——sqlilabs16-26

文章目录 less-163.注入 less-172.数据库名2.1 floor报错注入数据库名 3.查到数据表3.1floor 报错注入数据表 4.查取列名4.1 floor报错注入 列名 5.查取内容 less-181.添加X-Forwarded-For测试2修改User-Agent测试3.查数据表名4.查数据列5.查取数据 less-192.查数据库3.查数据表…

医疗大健康解决方案HIS方案

本篇接上篇文章医疗大健康解决方案HIS方案-CSDN博客,介绍第二部分区域医疗解决方案。 依托腾讯云优势,联合合作伙伴,连接政府、医疗服务机构、医药研发与流通、康养等,构建医疗大健康产业云生态,助力数字化升级。 方…

小怡分享之数据结构基础知识准备

前言: 🌈✨之前小怡给大家分享了JavaSE的知识,今天小怡要给大家分享一下数据结构基础知识。 一、初识集合框架 1.什么是集合框架 Java集合框架Java Collection Framework, 又称为容器container,是定义在Java.util 包…

Linux服务器基于NFS实现共享目录

NFS简介:NFS(Network File System)是一种分布式文件系统协议,允许用户通过网络访问远程计算机上的文件和目录,就像访问本地文件一样。NFS 最初由 Sun Microsystems 在 1984 年开发,现在已经成为类 Unix 系统…

SpringBoot企业人事管理系统-附源码与配套论文

1.1引言 随着计算机技术的飞速发展,计算机在各种单位机构管理中应用的普及﹐管理信息系统的开发在强调管理、强调信息的现代社会中也显得越来越重要。因此,利用计算机高效率地完成人事管理的日常事务,是适应现代各种单位机构制度要求、推动各种单位机构…

【项目】火灾烟雾检测管理系统。PyQT5+QT Designe+YOLOv8_ssod半监督算法+OpenCV

【项目】火灾烟雾检测管理系统。PyQT5QT DesigneYOLOv8_ssod半监督算法OpenCV 0.摘要1.引言2.烟雾检测算法2.0图像标注2.1 YOLOv8全监督算法结构2.2 Efficient-Teacher半监督算法结构 3.性能对比图4.源码、论文获取 0.摘要 火灾是常见而危险的自然灾害,不仅对人类生…

数值分析【3】

目录 第四章 插值 边角料: 分段二次插值——三个一插​编辑 三次样条插值 小结:等距看差分​编辑 第五章 最小二乘 第六章 数值积分 代数精度​编辑 第四章 插值 边角料: 分段二次插值——三个一插 三次样条插值 三次阳台函数是光滑…

Oracle一对多(一主多备)的DG环境如何进行switchover切换?

本文主要分享Oracle一对多(一主多备)的DG环境的switchover切换,如何进行主从切换,切换后怎么恢复正常同步? 1、环境说明 本文的环境为一主两备,数据库版本为11.2.0.4,主要信息如下: 数据库IPdb_unique_n…

落子“用户Happy”,vivo的“做活”与“长气”之道

有人说,中国手机行业,是名副其实的“Hard”模式。竞争焦灼,内卷不止。然而,这种主观的判断,也许从侧面反映出另一个客观事实:中国手机市场,凭借巨大的用户规模、多元化的消费倾向、自由展开的科…

从微软蓝屏事件聊到数据库系统中的纸牌屋

2024 年 7 月 19 日,全球约有 850 万台 Windows 电脑崩溃,无法重启,陷入蓝屏死机状态。这次故障影响了全球各地的企业和政府,波及运输、金融服务、医疗保健等绝大多数行业。 故障发生几小时后,蓝屏原因找到&#xff0…

Python 数组计算逻辑

a{1,2,3} b{2,3,4} 与 & 交集(取中) a&b{2, 3} 或 | 并集 (左中右) a&b{1,2,3,4} 差集 ^ 取左右 a^b {1,4} 减 - 取左 a - b {1} a-b {1}

同态加密和SEAL库的介绍(二)BFV 基础方案实现

写在前面: 本篇具体讲解如何使用 BFV 加密方案对加密的整数进行简单的计算(一个多项式评估),来源是官方提供的示例。BFV 是比较常见的方案,在很多大模型推理的时候,都是将浮点数的权重和输入变换成…

新品周销量20W+,月GMV1300W+,黑马品牌如何实现快速突围?

随着视频号用户的不断增加,直播带货生态的不断发展,越来越多的品牌也开始入局视频号。 近期友望数据发现,不少新品牌在视频号上脱颖而出。比如服饰内衣行业品牌「瑰菲女神」,专注女性内衣裤行业,周销量近20W件&#xf…

Java 并发(二)—— AQS原理

AQS,全名AbstractQueuedSynchronizer。 抽象队列同步器定义多线程访问共享资源的同步模板,解决了实现自定义同步器时涉及的大量细节问题,简化开发两种同步状态:独占、共享核心组件:State变量、CLH变体队列、获取 / 释…

Leetcode每日刷题之75. 颜色分类(C++)

有接触过数据结构的同学应该知道排序有很多种类,我之前也出过一篇 排序大杂烩 的博客,其中包含了一部分排序的讲解,排序在我们学习编程的过程中有着至关重要的作用,不论是大部分新手刚开始接触的冒泡排序还是C库中的sort函数&…

对象类作为类成员(详解版)

我们在第13行创建了一个人的类,并且给它赋予了两个属性,一个为int 类型的age,另一个则是Phone类型的 name,众所周知class类是一个自定义的数据类型,和struct相似,两者在默认情况下的权限不一样。而我们这时候没有Phone的数据类型&…

Docker 入门全攻略:安装、操作与常用命令指南

目录 Docker 入门全攻略:安装、操作与常用命令指南 一、引言 二、Docker 下载与安装 2.1 Docker 的系统要求 2.2 安装步骤 ①对于 Windows 的安装指南 ②对于 macOS 的安装指南 ③对于 Linux 的安装指南 三、Docker 的基本概念 3.1 镜像(Image…