MySQL_9 事务机制与隔离机制

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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--------------------------------------------------------------------------------");

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
357 2
|
4月前
|
缓存 关系型数据库 MySQL
MySQL并发支撑底层Buffer Pool机制详解
【10月更文挑战第18天】在数据库系统中,磁盘IO操作是性能瓶颈之一。为了提高数据访问速度,减少磁盘IO,MySQL引入了缓存机制。其中,Buffer Pool是InnoDB存储引擎中用于缓存磁盘上的数据页和索引页的内存区域。通过缓存频繁访问的数据和索引,Buffer Pool能够显著提高数据库的读写性能。
256 2
|
1月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
2月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
2月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
4月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
146 43
|
3月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
3月前
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。
|
4月前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
231 1
|
4月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?