MySQL_9 事务机制与隔离机制

news2024/11/13 14:57:56

目录

一、事务概述

        1.定义 : 

        2.事务和锁 : 

二、事务操作

        1.MySQL控制台事务的基本操作 : 

        2.代码演示 : 

        3.注意事项 : 

三、事务的“ACID”特性 : 

四、隔离机制

        1.介绍 : 

        2.分类 : 

        3.常用指令 : 


一、事务概述

        1.定义 : 

        事务用于保证数据的一致性,它由一组相关的DML(Data Manipulation Language) 组成,并且该组的DML要么全部成功,要么全部失败
        eg : 转账操作就需要用事务来处理,用以保证数据的一致性。

        2.事务和锁 : 

        当执行事务操作时(一组DML),MySQL会在表上加锁,防止其他用户修改表的数据,这对用户来讲是非常重要的。


二、事务操作

        1.MySQL控制台事务的基本操作 : 

        START TRANSACTION : 开启一个事务;

        SAVEPOINT point_name : 设置一个指定的保存点;

        ROLLBACK TO point_name : 回退事务到指定保存点;

        ROLLBACK : 回退全部事务,即直接恢复到事务刚开始的状态。

        COMMIT : 提交事务,删除保存点,所有的操作生效,无法回退。

        PS : 

        ①保存点 : 用于记录当前事务执行状态的点,通过回退操作回到指定保存点时,会取消该保存点与当前状态之间的事务,即删除这两个点之间的操作。若使用ROLLBACK TO 指令直接跨过了多个保存点,那么被跨过的保存点不可以再返回。
        ②使用COMMIT语句后,会确认事务的变化,结束当前事务并删除所有的保存点,接着释放锁,数据生效。结束事务后,其他会话(MySQL的其他连接)便可以查看事务变化后的新数据(所有数据正式生效)。

        2.代码演示 : 

                建立一张学生表,代码如下 : 

CREATE TABLE IF NOT EXISTS `stus`(
		`id` MEDIUMINT UNSIGNED UNIQUE NOT NULL,
		`name` VARCHAR(64) NOT NULL DEFAULT '',
		`score` DECIMAL(6,2) NOT NULL DEFAULT 0.0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

SELECT * FROM stus;

                使用START TRANSACTION 开始一个新的事务,向表中插入一些数据后,通过SAVEPOINT t1 设置保存点t1;再次向表中插入一些数据后,通过SAVEPOINT t2 设置保存点t2;接着,再次向表中插入一条数据。如下 : 

# 开启一个新的事务
START TRANSACTION;

INSERT INTO `stus`
		VALUES
		(1, 'Cyan', 429),
		(2, 'Ice', 433),
		(3, 'Five', 412);
# 设置第一个保存点
SAVEPOINT t1;

INSERT INTO `stus`
		VALUES
		(4, 'Rain', 422),
		(5, 'Reena', 400);
# 设置第二个保存点
SAVEPOINT t2;

INSERT INTO stus
		VALUES 
		(6, 'Chris', 500);

SELECT * FROM stus;

                这时,up突然发现t2保存点之后的DML操作,即第六条记录的添加,是有误的,不可能有人考这么高,于是想通过ROLLBACK TO 指令回到t2保存点时事务的状态,如下 : 

ROLLBACK TO t2;
SELECT * FROM stus;

                但是,up又发现t1保存点到t2保存点之间的DML操作,即第3,4,5条记录的添加,也是有问题的,不可能出现这么多400+,于是想通过ROLLBACK TO 指令回到t1保存点,如下 : 

ROLLBACK TO t1;
SELECT * FROM stus;

                这下up满意了,决定通过COMMIT操作正式提交事务,如下 : 

SELECT * FROM stus;

                那么,stus表最终便定格在了三条数据,如下 : 

                这时,如果还想继续通过ROLLBACK TO 指令来回退到t1保存点,会提示错误,如下 : 

        3.注意事项 : 

        若未开始任何事务,默认情况下DML操作会自动提交,不能回滚并且回滚无实际意义。

        若开启一个事务后,在执行DML期间没有设置任何保存点,那么使用ROLLBACK指令会默认回退到事务刚开始的状态。

        若业已开启一个事务,在事务未提交之前可以创建多个保存点,并且可以选择回退到指定保存点。

        MySQL事务机制的使用需要INNODB存储引擎的支持,MyISAM并不可行。

        除了START TRANSACTION操作外,SET AUTOCOMMIT = OFF 指令,也可以开始一个新的事务


三、事务的“ACID”特性 : 

        1° 原子性(Atomicity):

        原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

        2° 一致性(Consistency):

        事务必须使数据库从一个一致性状态变换到另一个一致性状态。

        3° 隔离性(Isolation):

        事务的隔离性是指,多个用户并发的访问数据库时,数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。(REPEATABLE Read)

        4° 持久性(Durability):

        持久性是指,一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。


四、隔离机制

        1.介绍 : 

        当多个连接开启各自事务来操作数据库中的数据时,数据库系统DBS要负责隔离操作,以保证各个连接在获取数据时的准确性

        若不考虑隔离的问题,可能会引发脏读,幻读,不可重复读等问题。

        PS : 

        ①脏读 : Dirty Read. 当一个事务读取到了另一个事务尚未提交的修改时,就会发生脏读。

        ②幻读 : Phantom Read. 当同一查询在同一事务中多次进行时,由于其他提交事务所做的插入操作,使得当前事务每次返回不同的查询结果,此时发生幻读。

        ③不可重复读 : Nonrepeatable Read. 当同一查询在同一事务中多次进行时,由于其他提交事务所做的删除或修改操作,使得当前事务每次返回不同的查询结果,此时发生不可重复读。

        PS :
        脏读指的是读到了其他事务未提交的修改;而幻读和不可重复读都是在其他事务已经提交的前提下。

        为什么要避免脏读,幻读,和不可重复读?
        因为用户连接到数据库,开始一个事务后,肯定是想读取到开启时刻数据库中的数据。

        2.分类 : 

        MySQL中支持四种隔离级别隔离级别不同,事务与事务之间的隔离程度便不同。具体分类如下 : 

        隔离级别越高,性能也越差。 

        PS : 

        ①Read Uncommitted : 该隔离级别下的事务可以读到其他事务未提交和已提交的操作所改变的数据。

        ②Read Committed : 该隔离级别下的事务可以读到其他事务已提交的修改,删除,增加操作所改变的数据。

        ③Repeatable Read : 这是MySQL默认的隔离级别(一般不做修改)该隔离级别下的事务可以读到启动事务时刻数据库中的数据,并且不会被其他事务所进行的DML操作所影响

        ④Seralizable : 该隔离级别最牛逼。事务要对某数据库中的指定表进行访问时,会先判断当前表有没有其他事务正在操作,如果有,当前事务就会一直等待,直到没有其他事务操作该表时,才能访问成功,该隔离级别下读取到的数据是其他事务修改后的数据,但是由于最后已经没有其他事务操作要访问的数据,所以不会出现返回的查询结果不一致的情况。

                演示(Seralizable) : 

                在CMD下登录两个用户,并将要访问的数据的用户的隔离级别修改为Seralizable,而操作stus表的用户仍是默认的Repeatable。如下图所示 : 

                此时,分别在两个会话下开启事务,并且令操作stus表的事务进行数据的修改和添加操作。如下 : 

                继续,在SERIALIZABLE隔离级别用户下访问stus,会因为加锁而等待,如下图所示 : 

                这时,令正在操作stus表的用户提交事务,则要访问stus表的用户才可以成功方法,如下图所示 :  

        3.常用指令 : 

        查看当前会话(用户)的隔离级别 : 

        SELECT @@TRANSACTION_ISOLATION;

        查看你当前系统的隔离级别 :

        SELECT @@GLOBAL.TRANSACTION_ISOLATION;

        设置当前会话的隔离级别 : 

        SET SESSION TRANSACTION ISOLATION LEVEL isolation_name;

        设置当前系统的隔离级别 : 

        SET GLOBAL TRANSACTION ISOLATION LEVEL isolation_name; 

                eg : 

# 查看当前连接的隔离级别
SELECT @@transaction_isolation;

# 查看当前系统的隔离级别
SELECT @@GLOBAL.TRANSACTION_ISOLATION;

                PS : 
                如何修改MySQL默认的隔离级别?

                全局修改,在my.ini配置文件最后加上transaction-isolation = 参数
                其中,参数可以是——(注意“-”格式)
                ①READ-UNCOMMITTED;
                ②READ-COMMITTED;
                ③REPEATABLE-READ;
                ④SERIALIZABLE;

        System.out.println("END--------------------------------------------------------------------------------");

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

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

相关文章

python批量实现pdf转换为图片|实现pdf转为jpg/png|实现word批量转pdf|python批量实现word转换为图片

本文介绍了一种使用 Python 脚本来完成这项工作的方法,该脚本基于 PyMuPDF、pdf2image 和 win32com 库实现,可以帮助您快速地将 Word 文档转换为 PDF 文件,并将 PDF 文件转换为 PNG 图片。 一、安装所需的库和软件 在开始使用该脚本之前&am…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(一):概述

AWTK=Toolkit AnyWhere,一款国产免费开源工具,ZLG开发的开源GUI引擎,为嵌入式等系统提供图形界面开发IDE。 随着汽车技术的发展,汽车仪表盘也在快速发展,从最初的机械式到电气式,再到数字化。这次电动化、智能化又一次让汽车仪表出现了飞跃式的发展,再未来,仪表板上可…

04SpringCloud 消息中间件

为什么要使用消息中间件 同步通信:耗时长,受网络波动影响,不能保证高成功率,耦合性高。 同步,异步 并发:一段时间(1S)多个请求数 并行:时间节点,多个指令…

干接点与湿接点

(1)干接点的定义 无源开关;具有闭合和断开的2种状态;2个接点之间没有极性,可以互换。 常见的干接点信号有: 1)各种开关如:限位开关、行程开关、脚踏开关、旋转开关、温度开关、液…

超越象限:解密 α 碎片的归属问题

文章目录 参考环境α 碎片的归属问题问题概述终边相同角圆心角终边相同角 象限角 描述象限角第一象限角任意象限角 特殊方案问解 叠加坐标系上部下部叠加坐标系 一般方案问解任意角 α分析绘图要领叠加坐标系N-N 参考 项目描述搜索引擎Google 、Bing百度百科首页佟大大还是ETT…

苹果iPhone14如何批量删除联系人?iPhone 14批量删除联系人方法

苹果iPhone 14如何批量删除联系人?手动一个个删实在太麻烦了! 苹果iPhone 14手机的通讯录本身不支持批量删除联系人,但是如果通讯录在iCloud中开启过备份,就可以对联系人进行批量操作。 需要注意的是,iPhone 14手机端…

聊聊开源的类ChatGPT工作——ChatGLM

这是”聊聊开源的类ChatGPT工作“的第二篇,写第一篇[7]的时候,当时恰巧MOSS开源,就顺手写了MOSS。但要问目前中文领域的“开源”的语言模型谁更强,公认的还是ChatGLM-6B(以下简称ChatGLM)。 下面是官方对C…

【20230531】Git命令和Github相关使用

1 在Git中缓存GitHub凭据 根据系统下载对应的GitHub CLI 2.25.1 2. github主页,点击用户头像选择settings->Developer Settings->Personal access tokens申请密钥(主要分为Fine-grained tokens和Tokens classic)gh需要使用的是Tokens …

Spring Boot如何实现接口文档自动生成

Spring Boot如何实现接口文档自动生成 在开发Web应用程序时,接口文档是非常重要的一环,它可以帮助我们快速了解API的功能和使用方法,同时也是与其他开发人员和团队协作的重要工具。然而,手动编写和维护接口文档是一项繁琐的工作&…

商品上架业务

一.商品上架操作 将检索数据存入es,更改商品上架状态为已上架 二.业务设计 (1)设计检索数据 分析:商品上架在 es 中是存 sku 还是 spu? 1)、检索的时候输入名字,是需要按照 sku 的 title 进行…

给大龄准备转行网络工程师的朋友一些建议

我一直认为,网络工程师是一个看能力而不是看年龄的工作。 大龄转行网络工程师到底有没有机会?很多三十多岁的朋友对于跨行业完全心里没底,冒然转行学习网工又不知道从何学起。今天就给大家整理几个在学习网络工程师的时候需要注意的地方&…

Linux系统下imx6ull QT编程—— C++数据封装与数据抽象(八)

Linux QT编程 文章目录 Linux QT编程前言一、数据封装二、数据抽象 前言 封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数…

用JavaScript做一个拼图游戏

喜欢的可以复制下面完整代码查看效果在自己本地查看效果 实现难度&#xff1a;不算大&#xff0c;毕竟是小游戏 开发工具&#xff1a;html&#xff0c;css&#xff0c;js&#xff0c;jquery 效果截图 完整代码 <!DOCTYPE html> <html lang"en"> <he…

24届秋招专场·双指针巧解链表套路题

你好&#xff0c;我是安然无虞。 文章目录 合并两个有序链表分隔链表合并K个有序链表链表中倒数最后K个节点变形题: 删除链表的倒数第N个节点链表的中点判断链表是否有环环形链表II相交链表 大家好, 好久不见了, 从今天开始, 后面会经常更新笔试面试真题, 准备今年24届秋招的小…

Centos7安装Kubernetes 1.27.2

目录 一、准备工作 二、容器运行时 三、安装kubelet 、kubeadm、 kubectl 四、配置CNI 五、安装nginx 一、准备工作 1、更新yum源安装 vim、net-tools等工具&#xff08;每个节点都执行&#xff09; yum update -yyum install vim -yyum install net-tools -y 2、配置每…

简单移位器结构介绍

移位器 一位可控移位器 其实是一个复杂的多路开关电路&#xff0c;根据不同控制信号&#xff0c;将输入左移或右移或不变。多位的移位可以简单串联这样的单元实现&#xff0c;但移位位数多时&#xff0c;该方法过于复杂&#xff0c;不实用并且速度很慢。 桶形移位器 由晶体管…

C.12 军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏、可视化高亮展示等,助力工业应用场景快速落地

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

Linux内核漏洞提权

目录 Linux提权辅助工具 内核漏洞本地用户提权 - linux-exploit-suggester测试 内核漏洞Web用户提权 - 利用脏牛dcow 内核漏洞本地用户提权 - 利用DirtyPipe&#xff08;脏管&#xff09; 配置安全SUID提权 Linux提权辅助工具 这些工具都是C\C编写的&#xff0c;需要在目…

vmware虚拟机设置双网卡

文章目录 1. 配置虚拟机NAT模式2. 配置虚拟机桥接网络2.1 通过USB网卡2.1.1 配置虚拟机桥接网卡ip:2.1.2 配置windows主机桥接网卡ip:2.1.3 配置板子ip: 2.2 通过路由器2.2.1 配置板子ip: NAT 网卡&#xff1a;Ubuntu 通过它上网&#xff0c;只要 Windows 能上网&#xff0c;Ub…

北邮22信通:实验六 由运放器构成的音频放大电路设计、仿真、测试报告

北邮22信通一枚~ 持续更新模电实验讲解 关注作者&#xff0c;解锁更多邮苑模电实验报告~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 目录 实验目的&#xff1a; 设计要求&#xff1a; *补充&#xff1…