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)

大家都在看

  • 23种设计模式之迭代器模式

    文章目录 概述 迭代器模式的优缺点 迭代器模式的结构和实现 * 模式结构 模式实现 总结 ; 概述 迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟…

    数据库 2023年6月6日
    071
  • 在Debian系统上安装StoneDB数据库

    今天我会进行StoneDB数据库在Debian系统下的安装。官方文档中没有说明在Debian系统的安装步骤,我来试试能否顺利安装。 准备Debian系统 我是在本地使用虚拟机安装的…

    数据库 2023年5月24日
    081
  • mysql索引

    MySQL索引: MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 1.创建索引1.1单独创建索引 1.2修改表结构创建索引 1.3创…

    数据库 2023年6月11日
    090
  • 事务

    事务 *事务的简介 事务是一组操作的合集,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体,一起向系统提交或撤销操作请求,这些操作只有同时成功、同时失败; 事务的操作 查…

    数据库 2023年6月16日
    096
  • Javaweb10-javaweb其他知识点

    1、详解DefaultServlet与JspServlet 当服务端收到关于 Servlet的请求之后交由 自定义Servlet处理。 当服务端收到关于 静态资源的请求时交由 De…

    数据库 2023年6月16日
    077
  • Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 hex(512) # 10进制转16进制 ‘0x200’int…

    数据库 2023年6月9日
    099
  • Java 函数式编程

    有且仅有一个未实现的非静态方法的接口叫做”函数式接口” interface IFactory<t> { T create(); } </t…

    数据库 2023年6月6日
    0122
  • Eureka详解系列(五)–Eureka Server部分的源码和配置

    按照原定的计划,我将分三个部分来分析 Eureka 的源码: 今天,我们来研究第三部分的源码。 分析的思路和第二部分的一样,先明确 Eureka Server 需要具备哪些功能,再…

    数据库 2023年6月6日
    081
  • vue入门(一)

    模板语法 插值语法 功能:用于解析标签体内容 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。 指令语法 功能:用于解析标签(包括:标签属性、标签内…

    数据库 2023年6月6日
    087
  • 动手实验查看MySQL索引的B+树的高度

    一:文中几个概念 h:统称索引的高度;h1:主键索引的高度;h2:辅助索引的高度;k:非叶子节点扇区个数。 二:索引结构 叶子节点其实是双向链表,而叶子节点内的行数据是单向链表,该…

    数据库 2023年6月14日
    0103
  • Vue 2.0 基础

    知识点 1.是一个MVVM框架 由MVC架构衍生,分为View(视图层)、ViewModel(数据视图层)、Model(数据层),MVVM 最标志性的特性就是 数据绑定,实现数据驱…

    数据库 2023年6月11日
    0104
  • Python–模块Module

    1、定义模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件,(文件名:test.py,对应的模块名test)包:用来…

    数据库 2023年6月9日
    089
  • leetcode 101. Symmetric Tree 对称二叉树(简单)

    一、题目大意 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3]输出:true 示例 2: 输入:root =…

    数据库 2023年6月16日
    085
  • 使用 GitHub 协同开发规范

    记一下项目开发的规范,统一开发规范可以有效提高共同开发效率和代码质量 本文档图片的 winsoullin 理解为团队正式发布的仓库,Nightnessss 理解为个人仓库 Fork…

    数据库 2023年6月9日
    0119
  • LVS负载均衡

    LVS负载均衡 LVS负载均衡 一、LVS是什么 二、LVS的作用 三、lvs的三种工作模式 1.基于NAT的LVS模式负载均衡 2.基于TUN模式的LVS负载均衡 3.LVS(D…

    数据库 2023年6月14日
    072
  • Kubernetes入门,使用minikube 搭建本地k8s 环境

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

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