首页 > 数据库 >MySQL InnooDB引擎之并发事务问题以及隔离级别的作用和区别

MySQL InnooDB引擎之并发事务问题以及隔离级别的作用和区别

时间:2022-11-15 23:22:25浏览次数:50  
标签:事务 隔离 重复 数据 并发 提交 MySQL InnooDB 级别

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

何为读已提交

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

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

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

何为可重复读

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

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

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

脏读现象:

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

打开两个窗口,同时执行事务A和B
image
此时事务B更新数据后并未提交,但可以看到事务A前后查询到的数据不一样,也就是读取到了其他事务还未提交的数据,这也就是脏读的现象

如何解决脏读现象:

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

image

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

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

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

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

image

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

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

幻读现象:

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

image

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

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

如何解决幻读的现象:

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

image

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

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

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

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

标签:事务,隔离,重复,数据,并发,提交,MySQL,InnooDB,级别
From: https://www.cnblogs.com/zhangpeiyao/p/16894442.html

相关文章

  • Mysql操作学习总结
    Cmd控制台mysql-uroot-p--连接数据库flushprivileges;--刷新权限showdatabates;--查看所有的数据库use数据库名;--切换数据库showtables;--查看数据......
  • centos7安装mysql及相关配置
    之前帮朋友在centos7安装mysql的时候,由于有些命令和centos6以及其他7的版本有点不一样,所以记录下1、安装推荐安装地址,但要注意下,他推荐的安装方式可以,设置mysql密码的时......
  • mysql 数据恢复 (.ibdata1, bin log)
    测试MySQL主题:两台电脑模拟故障后数据迁移恢复实验环境说明:windowsMySQL5.7版本,两台电脑台式机笔记本电脑1.实验一:数据库文件+ibdata1测试目的:通过拷贝数据库目录......
  • MYSQL ERROR 1146 Table doesnt exist 解析
    原创转载请注明出处源码版本5.7.14在MYSQL使用innodb的时候我们有时候会看到如下报错:ERROR1146(42S02):Table'test.test1bak'doesn'texist首先总结下原......
  • Ubuntu20 配置mysql8,redis
    mysql8安装ubuntu20库中默认的就是8.0版本sudoaptinstallmysql-server安装完成后进入mysql,起始root没有密码mysql-uroot设置root的密码usemysql;ALTERUSER......
  • 关于FastAPI异步并发的技术背景和细节
    FastAPI的路径操作函数,可以使用asyncdef定义:fromtypingimportUnionfromfastapiimportFastAPIapp=FastAPI()@app.get("/")asyncdefread_root():re......
  • MySQL基础
    MySQL基础今日目标:完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD1,数据库相关概念以前我们做系统,数......
  • 040_并发下集合类不安全
    目录并发下ArrayList不安全解决方案一:Vector(不推荐使用)解决方案二:Collections.synchronizedList()解决方案三:CopyOnWriteArrayList(推荐使用)并发下HashSet不安全解决方......
  • C++动态链接MySQL库
    C++链接MySQL库库安装目录CMakeListcmake_minimum_required(VERSION3.22)project(MySQLConnectionPool)include_directories(/usr/include/mysql) #安装库路径s......
  • MySQL in Windows安装以及异名恢复的简单过程
    下载相关建议获取最新版本的Mysql数据库可以获取zip格式的安装文件https://dev.mysql.com/downloads/mysql/或者获取msi格式的安装文件https://dev.mysql.com/dow......