首页 > 数据库 >MySQL事务隔离级别

MySQL事务隔离级别

时间:2024-04-02 13:22:05浏览次数:19  
标签:事务 读取 提交 MySQL 级别 隔离

简单来说,事务就是要保证一组数据库操作,要不全部成功,要不全部失败,在 MySQL 中,事务支持是在存储引擎层面的,比如 MySQL 的原生 MyISAM 存储引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因。

一、隔离性

事务的隔离性,就是我们常说的 ICAD(Atomicity,Consistency,Isolation,Durability,即原子性一致性隔离性持久性

  • 原子性:事务的最小单位,保证 MySQL 的一组数据库操作,要不全部成功要不全部失败
  • 一致性:执行事物前后,数据资源保持一致,比如转账,无论转账是否成功,转账者和收款者的总额应该是不变的。
  • 隔离性:并发访问数据库时,不同事物之间的数据应该是隔离的
  • 持久性:一个事物被提交后,他对数据库的数据的改变是持久的,即使数据库发生故障数据也不会变化

当数据库上有多个事务同时执行的时候,就可以出现脏读不可重复读幻读的问题

  • 脏读:A 事务中,读取到 B 事务中修改但未提交的数据,之后 B 事务回滚,导致 A 事务读取到的是一个不存在的数据,即脏数据
  • 不可重复读:A 事务中读取字段 name=lisi,此时 B 事务修改 name=zhangsan 并提交,之后 A 在事务中再次读取 name=zhangsan,这就导致 A 在同一个事务中两次读取到的数据不一致
  • 幻读:幻读跟不可重复读有点像,不过不可重复读针对的同一条记录不可重复读取,幻读指的是 A 事务读取 name=lisi 有四条记录,此时 B 事务删除了一条 name=lisi 的记录,之后 A 再次去读 name=lisi 只能读取到三条记录了,幻读针对的是记录的数量,可以看作是不可重复读的特例

为了解决以上问题,就有了隔离级别的概念

二、隔离级别

再说隔离级别之前,我们应该知道,隔离的越严格,效率就最低,因此我们很多时候,需要在隔离级别和效率之间寻找一个平衡点
SQL 标准的事务隔离级别包括:读未提交(read uncommitted)读已提交(read committed)可重复读(repeatable read)串行化(serializable)

  • 读未提交:一个事务还没提交时,它做的变更就能够被其他事务看到
  • 读已提交:一个事务提交后,它做的变更才能被其他事务看到
  • 可重复读:一个事务执行过程中看到的数据,总跟这个事务在启动时看到的数据是一致的,当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的
  • 串行化;对于同一行记录,写会加写锁,读会加读锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行

三、案例

mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);

我们来看看在不同的隔离级别下,事务 A 查到的 V1,V2,V3 分别是什么值

  • 读未提交:A 事务能够读取到 B 事务更改未提交的数据,所以 V1=2,V2=2,V3=2
  • 读已提交:A 事务只能读取到 B 事务提交后的数据,所以 V1=1,V2=2,V3=2
  • 可重复读:在 A 事务开启后,读取到的数据都是一样的,所以 A 事务开始的时候值是 1,所以 V1=1,V2=1,V3=2
  • 串行化:在事务 B 将 1 改成 2 的时候,会被锁住,直到 A 事务提交后,事务 B 才能继续执行,所以从 A 的角度来看,V1=1,V2=1,V3=2

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准

  • 可重复读隔离级别下,这个事务是事务启动时创建的,整个事务存在期间都用整个视图
  • 读已提交隔离级别下,整个视图是在 SQL 语句开始执行的时候创建的
  • 这里值得注意的是,读未提交隔离级别下直接返回记录上的最新值,没有视图概念
  • 串行化隔离级别则是通过直接加锁的方式来避免并行访问

四、总结

在不同的隔离级别下,数据库行为是不同的,Oracle数据库默认隔离级别是读已提交MySQL默认隔离级别是可重复读,如果存在 Oracle 迁移到 MySQL,为保证数据库隔离级别一致,需要将 MySQL 的隔离级别改成读已提交

MySQL 配置的方式是,将启动参数transaction-isolation的值设置成READ-COMMITTED,可以使用show variables like 'transaction_isolation';来查看当前隔离级别

正常情况下,为了保证效率,我们一般都会把事务隔离级别调整成读已提交,那么什么时候需要可重复读的场景呢?大多数在做数据校对的时候,不希望有其他事务来干扰数据,启动可重复读是很方便的


我是一零贰肆,一个关注Java技术和记录生活的博主。

欢迎扫码关注“一零贰肆”的公众号,一起学习,共同进步,多看路,少踩坑。

标签:事务,读取,提交,MySQL,级别,隔离
From: https://www.cnblogs.com/sun2020/p/18110369

相关文章

  • 基于springboot+vue+Mysql的企业客户信息反馈平台
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示系统首页技术文档界面问题信息界面个人中心后台登录界面管理员功能界面客户管理界面问题信息......
  • Mac彻底卸载MySQL
     默认路径sudorm/usr/local/mysqlsudorm-rf/usr/local/mysql*sudorm-rf/Library/StartupItems/MySQLCOMsudorm-rf/Library/PreferencePanes/My*rm-rf~/Library/PreferencePanes/My*sudorm-rf/Library/Receipts/mysql*sudorm-rf/Library/Receipts/MyS......
  • mysql存储过程编写步骤
    1.创建存储过程DELIMITER$$  #将语句的结束符号从分号;临时改为2个$$(可以是自定义的)CREATEPROCEDUREProc()#创建存储过程,过程名为Proc,不带参数BEGIN #存储过程,以BEGIN关键字开......
  • M1 安装MySql
    一:下载MySQL下载地址:MySQL::DownloadMySQLCommunityServer下载所需版本的dmg安装包,点击Archives可以选择历史版本: 这里我选择安装8.0.31。注意:版本8.x.x中所有版本可以在安装过程中设置MySQL的密码,而之前的所有版本(比如5.7.X之类的),系统会在安装过程中弹出一个......
  • 大厂级别交互设计秘籍:一篇读懂
    交互式设计属于UI设计之一,也是当今流行的设计之一。许多大型工厂非常需要交互式设计人才,这一趋势也引起了许多毕业生和UI设计爱好者的广泛关注,那么你知道大型工厂设计师必要的交互式设计是什么吗?这篇文章将带你了解。什么是交互设计交互设计又称交互设计。交互设计更受欢迎,即......
  • Linux ntsysv命令教程:如何配置运行级别服务(附案例详解和注意事项)
    Linuxntsysv命令介绍ntsysv(NetworkSysV)是一个命令行应用程序,它提供了一个简单的文本用户界面来配置在选定的运行级别中要启动的服务。这个工具显示了可用服务的列表(来自/etc/rc.d/init.d/目录的服务)以及它们的当前状态和描述。Linuxntsysv命令适用的Linux版本ntsysv命......
  • mysql -约束合集笔记
    SQL创建数据库createdatabaseschoolUSEschool#(数据库名)创建数据库表:createtablestudents(useridINTNOTNULLPRIMARYkey,lastnamevarchar(255),firstnamevarchar(255))#创建student数据库表且设置userid为主键)SQL约束:查看某个表已有的约束:#inform......
  • 【附源码】JAVA计算机毕业设计汪汪喵宠物寄养中心系统设计与开发(源码+mysql+文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着社会的发展和人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。人们对宠物的关爱和投入也越来越多,这导致了宠物服务行业的迅速发展。其中,宠......
  • 【附源码】JAVA计算机毕业设计网上扶贫农产品销售系统(源码+mysql+文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义随着互联网技术的迅速发展,传统的农产品销售模式已经不能满足现代消费者的需求。尤其是在扶贫领域,由于地理位置偏远、信息不对称等因素,贫困地区的农产品往往难以打......
  • 【附源码】JAVA计算机毕业设计网络安全知识学习系统(源码+mysql+文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在信息技术飞速发展的今天,网络安全已经成为社会关注的热点问题。随着网络应用的普及和互联网技术的不断进步,网络攻击、数据泄露、恶意软件等安全威胁日......