最近在复习MySQL事务,但网上很多博客和资料可以说讲的不是模棱两可就是只有文字描述不够形象易懂,下面通过我的学习来详细讲一讲事务并发都会引起哪些问题?以及隔离级别是什么?InnoDB引擎是如何通过隔离级别来解决并发事务所引起的问题?



何为读已提交

(相当于当前读,也就是这种隔离级别下只要有其他事务对数据进行更改的操作且提交,那么当前事务Select就会查询到最新的数据)

从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。

事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读),也就是不能读取到其他事务还未提交的数据,所以在读已提交这个隔离级别下就解决了脏读的问题

何为可重复读

(又称快照读,当事务A开启时便对数据产生一个快照,与此同时无论其他事务对数据如何操作,在当前这个事务A里查询到的都是快照中的数据)(又称快照读,当事务A开启时便对数据产生一个快照,与此同时无论其他事务对数据如何操作,在当前这个事务A里查询到的都是快照中的数据)

一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的。所以在可重复读这个隔离级别下就解决了一个事务当中前后读取到的结果不一致的情况,从而解决了不可重复读的问题

下面就通过实际操作来看看脏读,不可重复读,幻读这三个现象是什么样的,以及在InnoDB各个隔离级别下是如何解决了这些并发事务问题的。

脏读现象:

首先设置隔离级别为未提交读

打开两个窗口,同时执行事务A和B



此时事务B更新数据后并未提交,但可以看到事务A前后查询到的数据不一样,也就是读取到了其他事务还未提交的数据,这也就是脏读的现象

如何解决脏读现象:

首先设置隔离级别为已提交读:

打开两个窗口,同时执行事务A和B:





上述流程可以看到当隔离级别为已提交读时,已经解决了脏读的情况,但是当事务B对数据进行更改且提交时,事务A却出现了前后的查询结果不一致的情况,这种现象就叫做不可重复读。

如何解决不可重复读的现象:

首先设置隔离级别为可重复读:

打开两个窗口,同时执行事务A和B:





上述流程可以看到当隔离级别为可重复读时,已经解决了不可重复读的情况,当事务B对数据进行更改且提交时,事务A前后的查询结果一致,只有当事务A提交后再开启事务查询时才会查到最新的数据。

幻读现象:

首先设置隔离级别为可重复读:

打开两个窗口,同时执行事务A和B:



上述流程可以看到当隔离级别为可重复读时,事务A,B同时执行,事务A先查询到id=3是没有数据的于是想要Insert,此时事务B也insert了id=3的数据但是事务A却查询不到,并且当事务A insert的时候却提示了error,这种现象就称为幻读。

如何解决幻读的现象:

首先设置隔离级别为串行化:

打开两个窗口,同时执行事务A和B:







上述流程可以看到当隔离级别为序列化时,事务A,B同时执行,事务A先查询到id=4是没有数据,此时事务B想insert id=4的数据但是却阻塞了,接下来事务A执行了insert id=4d的操作,并且只要事务A不提交事务B都一直处于阻塞状态中,当事务A提交后事务B才不再阻塞,但此时却报错提示id=4已存在,从而解决了幻读的问题。

所以MySQL当中默认的隔离级别是不可重复读,一般也不会去手动更改。

综上所述基本说清楚了在InnoDB引擎当中所产生的并发事务问题,是如何解决的,以及为什么会有隔离级别这个概念,它们之间有什么区别,作用又是什么,希望本篇文章能够帮助大家更有效地理解这一部分的知识。

MySQL InnooDB引擎之并发事务问题以及隔离级别的作用和区别的更多相关文章

  1. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...

  2. MySQL数据库引擎、事务隔离级别、锁

    MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...

  3. MySQL存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试

    InnoDB和MyISAM简介 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写 ...

  4. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  5. 随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎

    MYSQL 解锁与锁表 - 专注it - 博客园 https://www.cnblogs.com/wanghuaijun/p/5949934.html 2016-10-11 16:50 MYSQL 解 ...

  6. MySQL · 引擎特性 · InnoDB 事务子系统介绍

    http://mysql.taobao.org/monthly/2015/12/01/ 前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoD ...

  7. MySQL存储引擎,优化,事务

    1唯一约束unique和主键key的区别?     1.什么是数据的存储引擎?       存储引擎就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数 ...

  8. MySQL · 引擎特性 · InnoDB 事务系统

    前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事 ...

  9. MySQL存储引擎与事务

    1.作用 和磁盘的数据打交道 2.简介 MySQL  基于存储引擎管理 表空间数据数据文件 3.种类 Innodb存储引擎ibd:存储表的数据行和索引frm:表基本结构信息Myisam存储引擎frmm ...

  10. Mysql InnoDB引擎下 事务的隔离级别

    mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...

随机推荐

  1. bat-MD文件转CSV文件

    目录 1. bat文件里面写死文件名 2. 拖入文件 注意:每个单元格不能出现字符[|.$.;] 1. bat文件里面写死文件名 @echo off && setlocal enabl ...

  2. 字节跳动端智能工程链路 Pitaya 的架构设计

    Client AI 是字节跳动产研架构下属的端智能团队,负责端智能 AI 框架和平台的建设,也负责模型和算法的研发,为字节跳动开拓端上智能新场景.本文介绍的 Pitaya 是由字节跳动的 Client ...

  3. Rust 从入门到精通06-语句和表达式

    1.语句和表达式 语句和表达式是 Rust 语言实现逻辑控制的基本单元. 在 Rust 程序里面,语句(Statement)是执行一些操作但不返回的指令,表达式(Expressions)计算并产生一个 ...

  4. 第二十四篇:对于dom的理解

    好家伙, HTML            CSS              JS structure style        function 结构体    样式     功能 <>   ...

  5. fastadmin后台分页设置显示方法

    ​ 1.参照日志列表的分页(后台代码都有) 2.修改默认分页配置,在初始化里面加上: pageList: [5,10,'all'], 3.显示列表: [$where, $sort, $order, $ ...

  6. KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份

    案例说明: 在生产环境,有的应用需要调用数据库的sys_rman做备份,为了区分数据库自身的sys_rman备份和应用的备份,可以使用不同的stanza name创建备份.本案例介绍了,如何在King ...

  7. C++ 调用 Python(通过Boost.Python)

    本文将用一个小的示例来展示如何通过Boost.Python 来实现 C++/Python 混合编程从而将两种语言的优势整合到一起. 1. CMakeLists.txt cmake_minimum_re ...

  8. MySQL 自增字段取值

    1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值 ...

  9. [题解] Codeforces Global Round 22 1738 A B C D E F 题解

    很久没rated打过cf的比赛了,这次打得还行,至少进前100了 点我看题 A. Glory Addicts 把类型0的数放进数组a里,类型1的数放进数组b里.如果\(|a|=|b|\),你可以把所有 ...

  10. DP 优化小技巧

    收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...