返回顶部
首页 > 资讯 > 数据库 >MySQL事务隔离机制详解
  • 638
分享到

MySQL事务隔离机制详解

MySQL事务隔离机制mysql事务隔离 2022-11-21 17:11:06 638人浏览 安东尼
摘要

目录前言一、什么是数据库事务二、事务并发带来的4类问题三、事务4种隔离级别四、Mysql演示4种隔离级别总结参考文章:前言 如何控制并发是数据库领域中非常重要的问题之一,mysql为了解决并发带来的问题,设计了事务隔离机

前言

如何控制并发数据库领域中非常重要的问题之一,mysql为了解决并发带来的问题,设计了事务隔离机制、机制、mvcC机制,用一整套机制来解决并发问题,本文主要介绍事务隔离机制。

一、什么是数据库事务

事务transaction(简写tx),在数据库中,事务是指一组逻辑操作,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与结束之间执行的全部数据库操作组成

事务具有以下4大特性,简称ACID:

1、原子性(Atomicity)
事务是一个原子操作单元,是不可分割的最小工作单元,就像化学中的原子,其对数据的修改,要么全都执行,要么全都不执行

2、一致性(Consistent)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
一致性也称作是完整性,就是说事务的执行不能破坏数据库的一致性,在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性

3、隔离性(Isolation)
数据库提供一定的隔离机制,当多个事务并发访问时,保证事务在不受外部并发操作影响的“独立”环境执行,当然了,不同的隔离级别决定了有多“独立”。

4、持久性(Durable)
事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

小结:原子性,持久性大家基本都能秒懂,隔离性也还好大家稍微想想都能理解,就是接下来要讲的隔离级别,但对一致性很多人被官方概念绕住了,其实就是在多事务并发时要保证数据的一致和完整,不理解的话先看下面的问题。

二、事务并发带来的4类问题

1、脏读(Dirty Reads)
事务A读取到了事务B修改但尚未提交的数据,然后事务B回滚了,因此事务A基于此数据做的操作都是无效的,就是读到了“脏”数据(实际上不应该存在的数据),所以叫脏读。

2、脏写或丢失更新(Lost Update)
第一类丢失更新:撤销rollback一个事务时,把其他事务已经提交更新的数据回滚掉了。
第二类丢失更新:提交commit一个事务时,把其他事务已经提交更新的数据覆盖掉了。

3、不可重复读(Non-Repeatable Reads)
在事务A中,按相同的条件执行查询过的sql,返回结果发生了修改或被删除了,这种现象就叫做“不可重复读”。

4、幻读(Phantom Reads)
在事务A中,按相同的条件执行查询过的sql,返回结果中有新数据(是其它事务插入的),就好像发生了幻觉一样,这就叫“幻读”。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改或删除,幻读侧重于新增。就这个结论网上很多博主写的是不可重复读侧重于修改,幻读侧重于新增或删除 (包括一些知名博主),大家请注意删除不属于幻读,我会在第四段演示时求证。另外后面我会单独安排一篇介绍MVCC机制,到时你自然会明白这里的原因。

三、事务4种隔离级别

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

每种隔离级别可能出现的问题如下:

事务隔离级别脏读不可重复读幻读
读未提交(RU)可能可能可能
读已提交(RC)不可能可能可能
可重复读(RR)不可能不可能可能
串行化(Serializable)不可能不可能不可能

1、读未提交(Read uncommitted,RU)

事务中的修改,即使没有提交,对其他事务也都是可见的,由于可能造成脏读,所以在实际应用中一般很少使用。

2、读已提交(Read committed,RC)

事务A修改并提交的数据才会对其它事务可见,所以解决脏读的问题。大多数数据库系统的默认隔离级别都是读已提交(像oraclepostgresql、SqlServer,但Mysql不是)。

3、可重复读(Repeatable read,RR)
Mysql默认的事务隔离级别。它保证了在同一个事务中多次读取相同记录的结果是一致的,所以解决了脏读和不可重复读问题,但未彻底解决幻读。

4、串行化(Serializable)

可串行化是最高的隔离级别。它通过强制事务串行执行,避免了前面所说的脏读,不可重复读和幻读问题。简单来说,可串行化会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。

四、Mysql演示4种隔离级别

在MySQL中,InnoDB引擎支持事务,MyISAM引擎不支持事务,所以本文实验的测试环境:windows 10 + MySQL5.7 + InnoDB。
Mysql5.7可以通过命令select @@tx_isolation;语句来查看:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

设置4种隔离级别的命令:

set tx_isolation='read-uncommitted';
set tx_isolation='read-committed';
set tx_isolation='repeatable-read';
set tx_isolation='serializable';

开始事务:

begin;

提交事务:

commit;

回滚事务:

rollback;

1、读未提交(RU)

set tx_isolation='read-uncommitted';
select @@tx_isolation;
begin;

验证脏读

在这里插入图片描述

2、读已提交(RC)

set tx_isolation='read-committed';
select @@tx_isolation;
begin;

验证解决脏读,存在不可重复读

![在这里插入图片描述](https://img-blog.csdnimg.cn/d4406ad1415c46008d824c48a9c382e6.png

验证幻读

在这里插入图片描述

3、可重复读(RR)

set tx_isolation='repeatable-read';
select @@tx_isolation;
begin;

验证解决脏读和不可重复读
上面说的不可重复读侧重于修改或删除,求证请看下面的截图,

在这里插入图片描述

验证幻读
Mysql的RR级别在一定程度上解决了幻读问题,但不够彻底,至于为什么这么说?还是那句话,得深入理解MVCC机制,这个会单独安排一篇,敬请期待!

在这里插入图片描述

4、串行化(Serializable)

set tx_isolation='serializable';
select @@tx_isolation;
begin;

在这里插入图片描述

如果长时间阻塞,最后会锁等待超时,抛出异常:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
换成是在事务A执行,结果也是一样会阻塞,直到其它事务完成或超时抛出同样的异常。
对于update也是同样的道理,详细如下图:

在这里插入图片描述

总结

通过本文我们已经详细说明了:

事务4大特性:ACID事务并发带来的4类问题:脏读、脏写、不可重复读、幻读事务的4种隔离级别:读未提交、读已提交、可重复读、串行化Mysql提供的4种隔离级别演示

剩下的MySQL锁机制和MVCC机制,我们下文见!

参考文章:

什么是事务?
三分钟图解事务隔离级别,看一遍就懂
MySQL事务隔离级别详解
MySQL的四种事务隔离级别
透彻解读mysql的可重复读、幻读及实现原理
【MySQL (三) | 五分钟搞清楚MySQL事务隔离级别】

到此这篇关于MySQL事务隔离机制的文章就介绍到这了,更多相关mysql事务隔离内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL事务隔离机制详解

本文链接: https://lsjlt.com/news/173153.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL事务隔离机制详解
    目录前言一、什么是数据库事务二、事务并发带来的4类问题三、事务4种隔离级别四、mysql演示4种隔离级别总结参考文章:前言 如何控制并发是数据库领域中非常重要的问题之一,MySQL为了解决并发带来的问题,设计了事务隔离机...
    99+
    2022-11-21
    MySQL事务隔离机制 mysql事务隔离
  • Mysql事务隔离实现机制
    事务隔离 隔离性与隔离级别 当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读 (non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有 了“隔离级别”的...
    99+
    2017-08-06
    Mysql事务隔离实现机制
  • MySQL事务隔离级别详解
    一、什么是事务? 事务是逻辑上的一组操作,要么全执行,要么全不执行。 事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这...
    99+
    2023-08-30
    mysql
  • 【MySQL】事务隔离机制 -- 必须说透
    文章目录 前言一、什么是数据库事务二、事务并发带来的4类问题三、事务4种隔离级别四、Mysql演示4种隔离级别总结 前言 如何控制并发是数据库领域中非常重要的问题之一,MySQL为了解决并发带来的问题,设计了事务隔离机制、锁机...
    99+
    2023-08-16
    mysql 事务 事务隔离机制 事务隔离级别 mysql事务隔离
  • SqlServer事务详解(事务隔离性和隔离级别详解) - 熊泽
    概述   不少人对于事务的使用局限于begin transaction:开始事务、commit transaction:提交事务、rollback transaction:回滚事务的初步运用。 并且知道使用事务后, 事务中所有操作命令必须...
    99+
    2019-10-07
    SqlServer事务详解(事务隔离性和隔离级别详解) - 熊泽
  • mysql事务隔离级别详情
    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab re...
    99+
    2024-04-02
  • 详解MySQL事务的隔离级别与MVCC
    事务隔离级别 事务并发执行遇到的问题 脏写 如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写 脏读 ...
    99+
    2022-05-16
    MySQL事务的隔离级别 MySQL MVCC
  • MySQL事务隔离性
    事务隔离性 当多个线程都开启事务操作数据库中数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。 如果没有隔离,会发生的几种问题 脏读(Dirty Read) 一个事务处理过程里读取了另一个未提交的事务中的数据 ...
    99+
    2017-07-23
    MySQL事务隔离性
  • MySQL事务的隔离级别详情
    目录一、隔离级别的概念二、测试TRANSACTION_READ_UNCOMMITTED隔离级别三、测试TRANSACTION_READ_COMMITTED隔离级别四、测试TRANSACTION_REPEATABLE_RE...
    99+
    2022-07-14
    MySQL事务的隔离级别 MySQL事务隔离
  • 深入理解Mysql事务隔离级别与锁机制问题
    概述 数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能导致脏读、脏写、不可重复度和幻读。这些问题的本质都是数据库的多事务并发问题,为了解决事...
    99+
    2024-04-02
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • MySQL事务隔离机制与实现原理是什么
    这篇“MySQL事务隔离机制与实现原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2022-11-30
    mysql
  • MySQL事务隔离级别
      四类隔离级别    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。  Read Unc...
    99+
    2024-04-02
  • MySql学习笔记之事务隔离级别详解
    背景 说的事务,大家应该都不陌生,开发用到 MySql 数据库的时候,通常会用到事务。其中比较经典的例子就是转账,比如你要给小明转 50 块钱,而此时你的银行卡也就只有 50 块钱...
    99+
    2024-04-02
  • MySQL 事务的隔离级别
    1. 事务的ACID 事务的ACID是指事务拥有的4个特性的首字母组合:atomicity(原子性), consistency(一致性), isolation(隔离性)和durability(持久性)。 ①atomicity(原子...
    99+
    2019-01-27
    MySQL 事务的隔离级别
  • MySQL的事务隔离级别
    目录数据库事务的四大特性⑴ 原子性(Atomicity)⑵ 一致性(Consistency)⑶ 隔离性(Isolation)⑷ 持久性(Durability)SQL的4种隔离级别Read Uncommitted(读取未提交内容)R...
    99+
    2021-07-07
    MySQL的事务隔离级别
  • mysql事务隔离的级别
    这篇文章主要介绍“mysql事务隔离的级别”,在日常操作中,相信很多人在mysql事务隔离的级别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql事务隔离的级别”的疑惑...
    99+
    2024-04-02
  • Java Spring事务的隔离级别详解
    目录引言数据库访问的并发性问题事务的隔离级别悲观锁和乐观锁总结引言 之前关于事务的文章已介绍了事务的概念以及事务的四个属性(ACID),相信你对事务应该有所认识和了解。 本篇文章是关...
    99+
    2024-04-02
  • 事务隔离性和隔离级别
    隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 事务的隔离级别有哪些? 一、概念 Read uncommitted(读未提交) Read ...
    99+
    2021-04-27
    事务隔离性和隔离级别
  • MySQL事务的隔离级别与并发控制
    标题:深入探讨MySQL事务的隔离级别与并发控制 随着数据库应用场景的日益复杂,事务的隔离级别与并发控制成为了数据库管理中不可或缺的重要话题。MySQL作为一款广泛使用的关系型数据库管...
    99+
    2024-03-01
    mysql 并发 事务 并发访问
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作