MySQL事务、隔离级别

一、事务简介

事务是操作的集合,它是一个不可分割的工作单元。事务将向整个系统提交或取消操作请求,即这些操作要么同时成功,要么同时失败。

[En]

A transaction is a collection of operations, which is an indivisible unit of work. Transactions will submit or cancel operation requests to the system as a whole, that is, these operations either succeed or fail at the same time.

二、有关事务操作

MySQL中的事务是默认的自动提交的,我们可以手动的去关闭 或者开启事务

#查看事务是否自动提交  
select @@autocommit;        # 等于1 默认自动提交

#设置事务提交方式
set @@autocommit = 0;       # 关闭自动提交事务

#也可以直接设置开启事务
start transaction ;
#或着
begin ;

#提交事务  如果业务操作正常完成就提交事务
commit ;

#回滚事务   如果业务操作在执行过程中出现异常 回滚事务保证事务的完整性和正确性
rollback ;

三、事务的四大特性(ACID)

原子性(Atomicity) : 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性 (Consistency) : 事务完成时,必须使所有的数据都保持一致状态。

隔离性(Isolation) : 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性(Durability) : 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

四、并发事务问题

1、脏读

一个事务读取另一个事务尚未提交的事务。

[En]

One transaction reads a transaction that has not been committed by another transaction.

2、不可重复读

一个事务一个接一个地读取相同的记录,但两次读取的数据不同。

[En]

A transaction reads the same record one after another, but the data read two times is different.

3、幻读

当一笔交易按条件查询数据时,它并没有这些数据,但在插入数据时,却发现该数据已经存在,这似乎是一种“幻觉”。

[En]

When a transaction queries the data according to the conditions, it does not have this data, but when inserting the data, it is found that the data already exists, which seems to be an “illusion”.

五、事务的隔离级别

1、读未提交(Read uncommitted)

它可能发生:脏读、不可重复读、幻读;最差隔离级别和最高性能。

[En]

It may occur: dirty reading, unrepeatable reading, phantom reading; the worst isolation level and the highest performance.

2、读已提交(Read committed)

可能出现:不可重复阅读、幻影阅读。

[En]

May appear: non-repeatable reading, phantom reading.

3、可重复读(Repeatable Read(mysql的默认隔离级别))

可能出现:幻读。

4、串行化(Serializable)

以上所有并发问题都可以解决,隔离级别最高,但性能最差。

[En]

All of the above concurrency problems can be solved, with the highest isolation level but the worst performance.

#查看事务隔离级别
select @@transaction_isolation;     # REPEATABLE-READ

#设置事务的隔离级别
set session transaction isolation level read uncommitted ;

set session transaction isolation level read committed ;

set session transaction isolation level repeatable read ;

set session transaction isolation level serializable ;

场景一

在idea中开启两个控制台,设置事务级别为 读未提交隔离级别 并开启事务

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 再次查询

MySQL事务、隔离级别

可见在控制台2执行更新操作后,还没提交,控制台1再次执行查询操作时,查询到的数据已经改变了,证实了 读未提交发生脏读现象

场景二

在idea中开启两个控制台,设置事务级别为 读已提交隔离级别 并开启事务

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 再次查询

MySQL事务、隔离级别

确认事务的隔离级别设置为已提交读以解决脏读问题

[En]

It is confirmed that the isolation level of the transaction is set to * read has been committed to solve the dirty read problem *

场景三

在idea中开启两个控制台,设置事务级别为 读已提交 并开启事务

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行commit提交后 控制台1 再次查询结果不同

MySQL事务、隔离级别

可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了 读已提交发生了不可重复读问题

场景四

在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行commit提交后 控制台1 再次查询结果相同

MySQL事务、隔离级别

可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了 可重复读隔离级别解决了不可重复读问题

场景五

在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务

控制台1 第一次查询 为空

MySQL事务、隔离级别

MySQL事务、隔离级别

控制台2 执行插入 并提交

MySQL事务、隔离级别

控制台1 执行相同的插入sql 发现已经存在 于是就查询,但是又查不到数据

对于控制台1来说就像是”幻觉”一样,证实了 可重复读隔离级别发生了幻读问题

场景六

在idea中开启两个控制台,设置事务级别为 串行化隔离级别 并开启事务

控制台1 执行查询 为空

MySQL事务、隔离级别

MySQL事务、隔离级别

控制台2 执行插入 可见操作阻塞

MySQL事务、隔离级别

控制台1提交事务后,控制台2才能够完成插入操作

这种阻塞效应有效地避免了虚读问题,证实了串行化隔离级别解决了虚读问题

[En]

This blocking effect effectively avoids the phantom reading problem and confirms that * serialization isolation level solves the phantom reading problem *

总结:实际使用还得根据业务本身去设置隔离级别,隔离级别越高、数据越安全高但性能也越差,隔离级别越低、数据越不安全但性能越好,在设置事务隔离级别时要权衡数据安全和性能。一般情况我们都会采用数据库的默认隔离级别(Repeatable Read)

Original: https://www.cnblogs.com/yclblogs/p/15978787.html
Author: 阿龙同学
Title: MySQL事务、隔离级别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507778/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linx__Ubuntu_APT

    apt是Advanced Packaging Tool的简称。 在Ubuntu下,我们可以使用apt命令进行软件包的 更新, 安装, 删除, 清理等 类似于Windows的软件管理…

    数据库 2023年6月14日
    0111
  • String s = new String(“xyz”)创建了几个实例你真的能答对吗?

    从面试题说起 String s = new String("xyz"); 创建了几个实例? 这是一道很经典的面试题,在一本所谓的Java宝典上,我看到的&#82…

    数据库 2023年6月16日
    072
  • Mybatis基础知识大全!!!

    1. 简介 1.1什么是Mybatis 1.2 如何获得Mybatis 1.3 使用Mybatis的好处: 2.初涉Mybatis 2.1环境搭建 2.2、创建一个模块(项目) 2…

    数据库 2023年6月16日
    0103
  • 汇编语言学习记录一

    0x00——什么是汇编语言? 汇编语言:早期实现程序员和机器进行交互的汇编指令集。 汇编指令,通过编译器,转换成机器码,从而使 机器 理解其指令。 0x01——汇编语言的组成 汇编…

    数据库 2023年6月11日
    072
  • Windows界面个人常用快捷键

    分享一下个人常用快捷键。 说明:字母排序规则遵循字母表(a->z) 快捷键 介绍 windows+d 由当前应用直接返回桌面,再按一次回到应用 windows+e 打开文件资…

    数据库 2023年6月14日
    097
  • 创建Django项目

    2022-09-24 在创建Django项目时,出现了 错误,查了一下,发现要创建一个Django项目,需要先使用命令: python -m pip install pytz 安装…

    数据库 2023年6月14日
    066
  • 【01】Maven依赖插件之maven-dependency-plugin

    1、analyze:分析项目依赖,确定哪些是已使用已声明的,哪些是已使用未声明的,哪些是未使用已声明的 2、analyze-dep-mgt:分析项目依赖,列出已解析的依赖项与dep…

    数据库 2023年6月9日
    082
  • Spring Security OAuth 笔记

    1 单点登录 关于单点登录的原理,我觉得下面这位老哥讲的比较清楚,有兴趣可以看一下,下面我把其中的重点在此做个笔记总结 https://juejin.cn/post/6844904…

    数据库 2023年6月14日
    073
  • MySQL8 Group By 新特性

    MySQL8 Group By 新特性 此生此夜不长好,明月明年何处看。 一、简介 MySQL8 新特性之 Group By 不再隐式排序。MySQL8对于group by 字段不…

    数据库 2023年6月14日
    061
  • 小试牛刀:Go 反射帮我把 Excel 转成 Struct

    背景 起因于最近的一项工作:我们会定义一些关键指标来衡量当前系统的健康状态,然后配置对应的报警规则来进行监控报警。但是当前的报警规则会产生大量的误报,需要进行优化。我所负责的是将一…

    数据库 2023年6月6日
    083
  • 存储过程procedure、触发器trigger

    一、存储过程procedure MySQL 5.0 版本开始支持存储过程。 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对…

    数据库 2023年6月9日
    070
  • 数据库持久化+JDBC数据库连接

    数据持久化就是 将内存中的数据模型转换为存储模型,以及 将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。 …

    数据库 2023年5月24日
    069
  • Docker三种文件系统总结

    概述 容器持久化,相比小伙伴都不陌生。通过Docker的volume,我们可以非常方便的实现容器数据的持久化存储。但volume之下的文件系统,相比许多小伙伴并不是非常清楚。因而本…

    数据库 2023年6月11日
    0120
  • SpringBoot 整合 MongoDB 实战解说

    在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词: 数据库、集合、文档!…

    数据库 2023年6月14日
    081
  • mysql的半同步复制

    binlog dump线程何时向从库发送binlog mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据…

    数据库 2023年6月9日
    076
  • 【转】SpringBoot多模块打包瘦身分离

    背景 首先项目是个多层级的多模块springBoot项目,每次打出来的jar包都在90M,其中包含核心代码以及所有依赖的jar包,上传到服务器速度比较慢。 由于核心代码(contr…

    数据库 2023年6月6日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球