首页 > 数据库 >MySQL数据基础知识整理—5

MySQL数据基础知识整理—5

时间:2023-05-24 20:05:45浏览次数:48  
标签:事务 读取 级别 MVCC 基础知识 MySQL 整理 数据 隔离

       今天是MySQL数据库基础知识整理的最后一章,本次我们要整理的是隔离性和MVCC多版本并发控制技术。

隔离性

       在我们进行多事务的处理时,难免会出现多个事务由于不当的操作导致事务发生不可逆转的错误结果。因此,MySQLS数据库为了防止这样的事情发生,使多个并发事物之间相互隔离,每个事务都感觉不到其他事务的存在,从而确保数据库的一致性和可靠性。

隔离性主要是预防以下四种情况而采取的不同隔离等级:

  1. 脏读:事务A读取到了事务B没有提交前所修改的数据

MySQL数据基础知识整理—5_隔离性

  1. 不可重复读:事务A多次读取同一个数据,由于事务B对该数据进行了修改,导致事务A读取数据前后不一致

MySQL数据基础知识整理—5_隔离性_02

  1. 幻读:事务A在读取某个范围内的数据时,事务B插入了某个数据,导致事务B前后读取的数据行数不一致

MySQL数据基础知识整理—5_MySQL数据库_03

  1. 丢失更新:事务A和事务B同时对一个数据进行更新,其中一个事务的更新被另一个事物的更新所覆盖,导致更新结果丢失

MySQL数据基础知识整理—5_MVCC_04

为了解决以上四种情况的发生,MySQL数据库提供了四种隔离级别,分别是:读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(serializable)。

  1. 读未提交:最低的隔离级别,在该级别下,一个事务可以读取另一个事务还未提交的数据。这种隔离级别会导致脏读、不可重复读、幻读等问题。
  2. 读已提交:在该级别下,一个事务只能读取另一个事务已经提交的数据。这种隔离级别可以避免脏读问题,但是仍然可能出现不可重复读和幻读问题。
  3. 可重复读:在该级别下,一个事务可以多次读取相同的数据,而其他事务不能对该数据进行修改。这种隔离级别可以避免脏读和不可重复读问题,但是仍然可能出现幻读问题。
  4. 串行化:在该级别下,所有事务都按照顺序依次执行,因此可以避免所有的并发问题,但是会牺牲一定的性能。

我们可以使用如下指令来设置事物的隔离级别:

set transaction isolation level 隔离级别;
//隔离级别可以是:read uncommitted,read committed,repeatable read,serializable

MySQL数据基础知识整理—5_隔离性_05

多版本并发控制

       多版本并发控制(Multi-Version Concurrency Control,MVCC)是一种数据库并发控制技术,它可以在数据库中允许多个事务同时读取和写入数据。MVCC 技术通过创建多个版本的数据来实现并发控制,每个事务都可以看到一组数据的某个版本,不会被其他事务的修改所影响。简单理解,MVCC技术主要解决的是读写问题。

该技术主要基于以下两个原则:

  1. 读取操作不会被阻塞。每个事务都可以读取数据的某一个版本,不会被其他事务的修改所阻塞。
  2. 写入操作不会覆盖旧数据。每个事务写入数据时,会创建一个新的版本,并保留旧版本。这样事务之间就不会相互干扰。

MVCC技术的核心思想:我可以查看当前事务开始之前的数据,但在我开始事务之后的数据我都查不到。也就是说,假设我的事务A开始了,是将数据balance=5改为balance=10,那么在我提交数据之前,我想查看历史数据,我就只能找到5更早之前的数据,而不能找到修改为10的数据了。这也就是MVCC技术所使用的快照读模式。

当前读

       当前读,也称为一致性读,是指读取最新提交的事务的数据。在当前读时,如果读取的数据正在被其他事务修改,则当前事务需要等待锁释放后才能读取最新的数据。当前读适用于对数据实时性要求较高的场景,如银行转账等。

快照读

       快照读,则是读取事务开始前数据库中的数据,即使在读取过程中数据被其他事务修改了,也不会影响快照读的结果。快照读适用于对数据实时性要求不高的场景,如数据报表等。我们常使用的MVCC技术就是使用的快照读模式。

本次的内容就到这里了,由于是基础知识的讲解,比较适合新手观看。如果其中有错误的地方希望大佬批评指正!!

标签:事务,读取,级别,MVCC,基础知识,MySQL,整理,数据,隔离
From: https://blog.51cto.com/u_15209404/6342736

相关文章

  • 同步mysql数据库binlog用户所需要权限
    同步mysqlbinlog用户读写权限报错提示doesnothaveREPLICATION_CLENTprivilege 使用场景:常用于阿里云flink同步数据库binlog使用解决方案:fiink cdc 的表用户,需要有Replicationclient,Replicationslave权限。授权命令如下:grantReplicationclienton*.* toods_base@......
  • 使用canal同步mysql数据到elasticsearch
    官方去下载canal包https://github.com/alibaba/canal/releases/tag/canal-1.1.6分为deployer、admin、adapter三个模块。deployer是数据库数据同步服务端。adapter是适配同步到不同终端,可以是es,hbase,redis其它数据库等。admin是一个配置管理中心,但是吧又没有配置adapter的界面,a......
  • PostMan连接Mysql数据库及相关操作
    前置:有nodejs环境1,安装xmysqlnpminstall-gxmysql 2,连接数据库xmysql-h主机名或者IP地址-u数据库账号-p密码-d数据库名  如果能看到数据库信息,生成的API的数量等信息,证明连接成功。 3,数据库操作连接成功后,可以直接访问API'sbaseURL地址,可以得到......
  • 01_MySQL基础架构
    01_MySQL基础架构MySQL45讲Note:课程专栏名称:《MySQL实战45讲》课程笔记参考:MYSQL45讲01_基础架构:一条SQL查询语句是如何执行的?一条SQL查询是如何执行的先看一下下面这个图​​我们首先理解一下Mysql的基础架构,理解如果执行一条简单的查询语句,Mysql进行了哪些操作。......
  • 【MySQL】2-深入理解MySQL体系认识及SQL的执行
    文章目录MySQL体系认识及SQL的执行MySQL体系结构clientconnectorsConnectionPoolSQLInterfaceParserOptimizer文件系统Cache工作原理缓存配置限制条件各存储引擎CSV引擎【表格存储】Archive存储引擎【压缩协议】Memory存储引擎【存储内存中、热点数据】Myisam【8.0淡出了历史舞......
  • mysql、sqlx
    1.导包goget-ugithub.com/go-sql-driver/mysqlimport_"github.com/go-sql-driver/mysql"_表示只执行包中init函数,mysql包会在init函数中注册自己。2.连接数据库利用基本库database/sql连接数据库1dsn:="root:123456@tcp(127.0.0.1:3306)/test_db"2db,err:=s......
  • Day02-关于java的基础知识
    关于java的基础知识java的特性和优势简单性面向对象可移植性高性能分布式动态性多线程安全性健壮性 JDK、JRE、JVMJDK:JavaDevelopmentkit(java开发工具)JRE:JavaRuntimeEnvironment(java运行时环境)JVM:JavaVirtualMachine(java虚拟机)......
  • MySQL8.0清空binlog
    环境centos7.9mysql Ver8.0.32登录MySQL,查看binlog日志#查看binlog日志开启状态,log_bin值为ON表示开启状态mysql>showvariableslike'log_bin';+---------------+-------+|Variable_name|Value|+---------------+-------+|log_bin|ON|+---------......
  • MySQL8.0配置my.cnf
    环境centos7.9因为是源码安装的MySQL8.0.32,查了一下MySQL8.0之后源码中不包含my.cnf文件和my-default.cnf文件了。手动创建一个my.cnf,放到默认目录/etc下,以后修改配置可以从my.cnf文件中修改,重启生效,相当于永久生效。文件内容:暂时先配这些,后期再扩展[client]port=3306soc......
  • MySQL保证主备一致,如何解决循环复制?
    备库只读,是如何和主库同步数据的?你可能会问,我把备库设置成只读了,还怎么跟主库保持同步更新呢?这个问题,你不用担心。因为readonly设置对超级(super)权限用户是无效的,而用于同步更新的线程,就拥有超级权限。主备同步的详细流程?可以看到:主库接收到客户端的更新请求后,执行内部......