MySQL_9 事务机制与隔离机制

这篇具有很好参考价值的文章主要介绍了MySQL_9 事务机制与隔离机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、事务概述

        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;

MySQL_9 事务机制与隔离机制

                使用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;

MySQL_9 事务机制与隔离机制

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

ROLLBACK TO t2;
SELECT * FROM stus;

MySQL_9 事务机制与隔离机制

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

ROLLBACK TO t1;
SELECT * FROM stus;

MySQL_9 事务机制与隔离机制

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

COMMIT;
SELECT * FROM stus;

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

MySQL_9 事务机制与隔离机制

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

MySQL_9 事务机制与隔离机制

        3.注意事项 : 

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

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

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

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

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


三、事务的“ACID”特性 : 

        1° 原子性(Atomicity):

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

        一致性(Consistency):

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

        隔离性(Isolation):

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

        持久性(Durability):

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


四、隔离机制

        1.介绍 : 

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

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

        PS : 

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

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

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

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

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

        2.分类 : 

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

MySQL_9 事务机制与隔离机制

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

        PS : 

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

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

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

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

                演示(Seralizable) : 

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

MySQL_9 事务机制与隔离机制

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

MySQL_9 事务机制与隔离机制

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

MySQL_9 事务机制与隔离机制

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

MySQL_9 事务机制与隔离机制

        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;

MySQL_9 事务机制与隔离机制

MySQL_9 事务机制与隔离机制

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

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

        System.out.println("END--------------------------------------------------------------------------------");文章来源地址https://www.toymoban.com/news/detail-470694.html

到了这里,关于MySQL_9 事务机制与隔离机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring 事务(编程式事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

    本篇重点总结: 在 Spring 项目中使用事务,有两种方式:编程式手动操作和声明式自动提交,声明式自动提交使用最多,只需要在方法上添加注解 @Transactional 设置事务的隔离级别 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事务隔离级别有5种 设置事务的传播机制 @Tra

    2024年02月03日
    浏览(43)
  • 【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

    【JavaEE】Spring 事务(2) 参数 作用 value 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器 transactionManager 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器 isolation 事务的隔离级别.默认值为solation.DEFAULT propagation 事务的传播机制,默认值

    2024年02月10日
    浏览(49)
  • 【MySQL】事务及其隔离性/隔离级别

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、事务的概念 1、事务的四种特性 2、事务的作用 3、存储引擎对事务的支持 4、事务的提交方式 二、事务的启动、回

    2024年02月12日
    浏览(49)
  • 深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn

    2024年03月21日
    浏览(83)
  • MySQL的事务特性、事务特性保证和事务隔离级别

            事务是指要么所有的操作都成功执行,要么所有的操作都不执行的一组数据库操作。 一、MySQL提供了四个事务特性,即ACID:          1. 原子性(Atomicity) :一个事务中的所有操作要么全部提交成功,要么全部回滚失败,保证事务的原子性。          2. 一

    2024年02月03日
    浏览(41)
  • 详解MySQL事务隔离级别

    一个事务具有 ACID 特性,也就是(Atomicity、Consistency、Isolation、Durability,即 原子性 、 一致性 、 隔离性 、 持久性 ),本文主要讲解一下其中的 Isolation ,也就是事务的 隔离性 。 概述 四种隔离级别分别是: 读未提交(Read Uncommitted) :最低的隔离级别,事务对数据的修改即使

    2024年02月09日
    浏览(52)
  • Mysql 索引 、事务、隔离级别

    目录 索引(index) 1.为什么要有索引? 2.引入索引的代价 3.索引的操作 4.索引的使用场景 5.索引的底层原理 事务 (transaction) 事物的回滚是怎么做到的 事物的四大特性 并发执行事务带来的问题 隔离级别 索引是一种为了加快数据库查询(操作)速度而引入的一种手段,需要占用额

    2024年01月20日
    浏览(59)
  • 【MYSQL】事务隔离级别

    脏读 一个事务正在对一条记录做修改,在这个事务完成并提交前,另一个事务也来读取同一条记录,读取了这些未提交的“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象的叫作’脏读’(Dirty Reads)。 例子:事务A修改了一条数据1状态

    2024年01月19日
    浏览(42)
  • MySQL的事务隔离级别

    目录 事务隔离级别的概念 脏读(Dirty Read): 不可重复读(Non-Repeatable Read): 幻读(Phantom Read): 读未提交(Read Uncommitted) 读未提交隔离级别的特点 示例 优势和劣势 读已提交(Read Committed) 读已提交隔离级别的特点 示例 优势和劣势 可重复读(Repeatable Read) 可重复读隔

    2024年02月09日
    浏览(51)
  • 【MySQL】事务与隔离级别详解

    事务就是一组DML语句组成 ,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体(原子性)。例如买票操作,上层看来是一个单纯的买票操作,但是下层却需要一条或多条SQL语句来完成转账操作,这一组SQL是一个整体,被称为事务。事务还

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包