MySQL事务的隔离级别详情

目录
  • 一、隔离级别的概念
  • 二、测试TRANSACTION_READ_UNCOMMITTED隔离级别
  • 三、测试TRANSACTION_READ_COMMITTED隔离级别
  • 四、测试TRANSACTION_REPEATABLE_READ隔离级别
  • 五、测试TRANSACTION_SERIALIZABLE隔离级别

一、隔离级别的概念

为什么要考虑隔离级别?

因为事务要并发执行,而并发执行可能会出现一些问题:脏读、不可重复读和虚读,有的是允许出现的,有的不允许出现,对于这种不同程度上的出现或不出现的并发控制才有了不同的隔离级别。

MySQL支持的四种隔离级别是:

  • TRANSACTION_READ_UNCOMMITTED:未提交读。说明在提交前事务A可以看到事务B的变化。这样读脏数据,不可重复读和幻读都是被允许的。
  • TRANSACTION_READ_COMMITTED:已提交读(oracle默认),说明读取未提交的数据是不允许的(防止脏读)。在这个级别仍然允许不可重复读和幻读发生。
  • TRANSACTION_REPEATABLE_READ:可重复读(MySQL默认),说明事务保证能够再次读取相同的数据而不会失败,即使其他的事务把这个数据改了,你也不会看到前后两次查询的数据的不同。但是幻读仍然会出现。
  • TRANSACTION_SERIALIZABLE:串行化,是最高的事务隔离级别,它防止脏读,不可重复读和幻读。串行执行,相当于是单线程操作,并发能力最低

注意:

事务隔离级别越高,为避免冲突所花费的性能也就越多,即效率低。在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别。

MySQL客户端默认工作在可重复读级别:

二、测试TRANSACTION_READ_UNCOMMITTED隔离级别

若此时A客户端rollback,数据库中zhangsan的年龄恢复到了20,这时候已经来不及了,因为B客户端已经拿着21去做业务了。

两个客户端都rollback放弃对当前事务对数据做的修改,zhangsan年龄恢复为20

三、测试TRANSACTION_READ_COMMITTED隔离级别

因为设置了已提交读隔离级别,所以事务B并没有发生脏读,这是由各种锁机制以及事务并发的MVCC版本控制实现的。

查询到了已经commit的数据,发生了不可重复读,这在已提交读隔离级别是允许发生的。既然发生了不可重复读,幻读就肯定可以发生了。

四、测试TRANSACTION_REPEATABLE_READ隔离级别

可重复读在一定意义上可以防止幻读的出现,可以看到,当前的可重复读隔离级别,防止了insert。其实可重复读隔离级别可以防止insert和delete,不能防止update。

实际上,事务A已经插入并且提交了,aaa已经存在,因为事务B update aaa的年龄成功了

前后两次同样的查询,后一次查询与前一次查询的数据量不同,就发生了幻读。也就是可重复读隔离级别下,并没有解决幻读的问题,要彻底解决幻读,就需要设置串行化隔离级别

五、测试TRANSACTION_SERIALIZABLE隔离级别

从现象看,串行化可以解决幻读,同样的条件进行查询,在另一个表里面插入数据时就被阻塞,由于事务B正在读数据,此时事务A再写数据就被阻塞了(用读写锁实现,允许读读,不允许读写或者写写)

MySQL server不会让自己执行事务的线程永远阻塞,导致当前线程占用的锁无法释放,而使得其他执行事务的线程也无法获得锁而永远阻塞。所以执行事务的线程都是带有时间的,当线程等待时间过长时,会让超时线程释放锁,并会返回一个错误:

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

(0)

相关推荐

  • 解决MySql8.0 查看事务隔离级别报错的问题

    目录 MySql8.0 查看事务隔离级别报错 问题 命令更改为 MySQL的事务隔离级别(包含mysql8.0+设置与查看) 一.事务的基本要素(ACID) 二.事务的并发问题 三.MySQL事务隔离级别 事务的隔离级别分为 四.数据库设置 Mysql 8.0+ 查询数据库事务隔离级别 MySql8.0 查看事务隔离级别报错 问题 数据库查看事务隔离级别 select @@global.tx_isolation,@@tx_isolation; 报错: mysql> select @@global

  • 一文了解MySQL事务隔离级别

    目录 前言 1.四种事务隔离级别 1.1 READ UNCOMMITTED 1.2 READ COMMITTED 1.3 REPEATABLE READ 1.4 SERIALIZABLE 1.5 小结 2.并发事务中的问题 2.1 脏读 2.2 不可重复读 2.3 幻读 3.隔离级别实战 3.1 查询事务隔离级别 3.2 设置事务隔离级别 3.3 脏读问题 3.4 不可重复读问题 3.5 幻读问题 总结 前言 MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总

  • MYSQL事务的隔离级别与MVCC

    目录 前言 1. 事务(transaction)的起源 1.1. 事务的定义 1.2. 哪些存储引擎支持事务 2. MySQL的事务语法 2.1. 自动提交 2.2. 手动操作事务 2.2.1. 开启事务 2.2.2. 提交或回滚 2.3. autocommit系统变量 3. 事务并发执行导致的读问题 3.1. 脏读 3.2. 不可重复读 3.3. 幻读 4. 回答一些可能存在的问题 5. SQL标准与4种隔离级别 5.1. 为什么要设置隔离级别? 5.2. 蹩脚的中文翻译 5.3. 为什么单单

  • 深入理解Mysql事务隔离级别与锁机制问题

    概述 数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能导致脏读.脏写.不可重复度和幻读.这些问题的本质都是数据库的多事务并发问题,为了解决事务并发问题,数据库设计了事务隔离机制.锁机制.MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题. 事务及其ACID属性 原子性:操作的不可分割: 一致性:数据的一致性: 隔离性:事务之间互不干扰: 持久性:数据的修改时永久的: 并发事务处理带来的问题 脏写:丢失更新,最后的更新覆盖了由其他事务所做的更

  • mysql事务隔离级别详情

    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab read 可重复读(默认隔离级别)(幻读) 在一个事务未提交之前,里面不论执行多少次查询,查询的结果都一样(即使这条记录被别的事务修改过)但是可能会出现幻读 read committed 读已提交(不可重复度,幻读) 在当前事务中别的事务提交的数据可以看到,那么可能会导致不可重复读(另一个线程提交数据后当前线程可以看到,然后就

  • 深入理解MySQL事务的4种隔离级别

    目录 1 简介 2 什么是数据库事务? 2.1 事务的四大特性(ACID) 3 并发事务会导致的问题 3.1 本文会使用到的 SQL 语句 3.1.1 示例表结构 3.1.2 查询事务的默认隔离级别 3.1.3 设置当前会话的事务隔离级别 4 事务的4种隔离级别和示例演示 4.1 读未提交 4.2 读已提交 4.3 可重复读 4.4 串行化 1 简介 事务的4种隔离级别分别是读未提交(Read Uncommitted).读已提交(Read Committed). 可重复读(Repeatable

  • mysql事务和隔离级别底层原理浅析

    目录 前言 一.事务底层原理浅析 原子性: 持久性 隔离性: 一致性: 二.隔离级别底层原理浅析 三.总结 前言 首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元). 事务的特性: 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.一致性(Consistency):事务执行的结果必须是使数据库从一个一致性

  • mysql在项目中怎么选事务隔离级别

    引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?" 你:"读未提交,读已提交,可重复读,串行化四个!默认是可重复读" 面试官:"为什么mysql选可重复读作为默认的隔离级别?" (你面露苦色,不知如何回答!) 面试官:"你们项目中选了哪个隔离级别?为什么?" 你:"当然是默认的可重复读,至于原因..呃..." (然后你就可以回去等通知了!) 为了避免上

  • MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现

    目录 前言 事务因并发出现的问题有哪些 脏读 不可重复读 幻读 不可重复读与幻读的区别 事务的四个隔离级别 InnoDB默认的隔离级别是RR Read UnCommited 读未提交 RU Read Commited 读已提交 RC Repeatable Read 可重复读 RR Serializable 串行化 undo 版本链 read view MVCC(Multi-Version Concurrent Control )多版本并发控制 可重复读实现 读已提交实现 LBCC 锁的类型 共享

  • MySQL事务的隔离级别详情

    目录 一.隔离级别的概念 二.测试TRANSACTION_READ_UNCOMMITTED隔离级别 三.测试TRANSACTION_READ_COMMITTED隔离级别 四.测试TRANSACTION_REPEATABLE_READ隔离级别 五.测试TRANSACTION_SERIALIZABLE隔离级别 一.隔离级别的概念 为什么要考虑隔离级别? 因为事务要并发执行,而并发执行可能会出现一些问题:脏读.不可重复读和虚读,有的是允许出现的,有的不允许出现,对于这种不同程度上的出现或不出现的并发控

  • 详解MySQL事务的隔离级别与MVCC

    事务隔离级别 事务并发执行遇到的问题 脏写 如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写 脏读 如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发生了脏读 不可重复读 如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询到最新值,那就意味着发生了不可重复读 幻读 如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的

  • Mysql事务的隔离级别(脏读+幻读+可重复读)

    目录 一.事务 (一)什么是事务 (二)事务的特征 (三)手动开启.提交.回滚事务 二.脏读.幻读.可重复读 (一)脏读 read uncommit (二)不可重复读 unrepeatable (三)幻读 (四)不可重复读和幻读的区别 三.事务的隔离级别 (一)读未提交read uncommitted (二)读已提交read committed (三)不可重复读 read repeatable (四)序列化 serializable 前言: 因为InnoDB是支持事务的,所以只对InnoDB的事

  • mysql的事务,隔离级别和锁用法实例分析

    本文实例讲述了mysql的事务,隔离级别和锁用法.分享给大家供大家参考,具体如下: 事务就是一组一起成功或一起失败的sql语句.事务还应该具备,原子性,一致性,隔离性和持久性. 一.事务的基本要素 (ACID) 1.原子性:事务开始后,所有的操作,要么全部成功,要么全部失败,不可能处于中间状态,事务是一个不可分割的整体,就像原子一样. 2.一致性:事务开始前和结束后,数据库的完整性约束没有破坏,A向B转账,A扣了钱,但B却没到账. 3.隔离性:同时发生的事务(并发事务)不应该导致数据库处于不一致

  • mysql+Spring数据库隔离级别与性能分析

    这里以mysql为例,先明确以下几个问题: 一.一般项目如果不自己配置事务的话,一般默认的是autocommit,即执行完一个操作后自动commit,提交事务. (注:事务是绑定在数据库操作上的,也就是当程序执行(statement.excute等操作)转而到数据库层面上的时候,事务才开始发生)当然spring可以将几个数据库操作动作绑在一个事务中,这样就需要介绍下spring事务配置方法,下面介绍的是常用方法,其他方法网上有很多.spring提供了很多事务配置的策略,很方便,简要介绍一下: 复

  • MySQL事务的隔离性是如何实现的

    目录 并发场景 写-写 读-读 读-写 和 写-读 MySQL中的锁 行级锁 表级锁 隔离级别 Read Committed Repeatable Read 参考博客 并发场景 最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务.今天就复盘一下单机事务的隔离性是如何实现的? 隔离的本质就是控制并发,如果SQL语句就是串行执行的.那么数据库的四大特性中就不会有隔离性这个概念了,也就不会有脏读,不可重复读,幻读等各种问题了 对数据库的各种并发操作,只有如下四种,写写,

随机推荐