MySQL_9 事务机制与隔离机制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 第九节 事务机制与隔离机制 内容分享。

目录

一、事务概述

       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.代码演示 :

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

CREATETABLE IF NOT EXISTS `stus`(    `id` MEDIUMINTUNSIGNED UNIQUE NOTNULL,    `name` VARCHAR(64)NOTNULL DEFAULT '',    `score` DECIMAL(6,2)NOTNULL DEFAULT 0.0) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;SELECT*FROM stus;

image.gif

image.png

image.gif编辑

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

# 开启一个新的事务
START TRANSACTION;INSERTINTO `stus`
VALUES(1,'Cyan',429),(2,'Ice',433),(3,'Five',412);# 设置第一个保存点
SAVEPOINT t1;INSERTINTO `stus`
VALUES(4,'Rain',422),(5,'Reena',400);# 设置第二个保存点
SAVEPOINT t2;INSERTINTO stus
VALUES(6,'Chris',500);SELECT*FROM stus;

image.gif

image.png

image.gif编辑

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

ROLLBACK TO t2;SELECT*FROM stus;

image.gif

image.png

image.gif编辑

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

ROLLBACK TO t1;SELECT*FROM stus;

image.gif

image.png

image.gif编辑

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

COMMIT;SELECT*FROM stus;

image.gif

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

image.png

image.gif编辑

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

image.gif编辑

       3.注意事项 :

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

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

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

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

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


三、事务的“ACID”特性 :

      原子性(Atomicity):

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

        一致性(Consistency):

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

        隔离性(Isolation):

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

        持久性(Durability):

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


四、隔离机制

       1.介绍 :

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

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

       PS :

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

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

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

       PS :

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

       为什么要避免脏读,幻读,和不可重复读?

       因为用户连接到数据库后,肯定是想读取到连接时刻下数据库中的数据。

       2.分类 :

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

image.gif 编辑

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

       PS :

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

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

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

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

               演示(Seralizable) :

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

image.gif编辑

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

image.gif编辑

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

image.png

image.gif编辑

               这时,只有当正在操作stus表的用户提交事务后,要访问stus表的用户才可以访问成功,如下图所示 :  

image.png

image.gif编辑

       3.常用指令(MySQL8.0) :

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

       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;

image.gif

image.png

image.gif编辑

image.png

image.gif编辑

               PS :

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

               全局修改,在my.ini配置文件最后加上transaction-isolation = 参数

               其中,参数可以是——(注意“-”格式)

               ①READ-UNCOMMITTED;
               ②READ-COMMITTED;
               ③REPEATABLE-READ;
               ④SERIALIZABLE;

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
SQL 存储 关系型数据库
MySQL----事务
MySQL----事务
14 3
|
27天前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
3天前
|
关系型数据库 MySQL 数据库
mysql事务的 四个特征(ACID)
mysql事务的 四个特征(ACID)
|
19天前
|
关系型数据库 MySQL
mysql事务隔离级别MVCC
mysql事务隔离级别MVCC
|
21天前
|
存储 关系型数据库 MySQL
深入浅出MySQL事务管理与锁机制
MySQL事务确保数据一致性,ACID特性包括原子性、一致性、隔离性和持久性。InnoDB引擎支持行锁、间隙锁和临键锁,提供四种隔离级别。通过示例展示了如何开启事务、设置隔离级别以及避免死锁。理解这些机制对优化并发性能和避免数据异常至关重要。【6月更文挑战第22天】
98 3
|
27天前
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
12天前
|
SQL 监控 关系型数据库
MySQL-长事务详解
MySQL-长事务详解
13 0
|
17天前
|
存储 关系型数据库 MySQL
重温MySQL的ACID实现原理:深入探索底层设计与机制
重温MySQL的ACID实现原理:深入探索底层设计与机制
|
18天前
|
存储 关系型数据库 MySQL
深入解析MySQL 8:事务数据字典的变革
深入解析MySQL 8:事务数据字典的变革
|
19天前
|
SQL 存储 关系型数据库
Mysql-事务-锁-索引-sql优化-隔离级别
Mysql-事务-锁-索引-sql优化-隔离级别