热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:事务的隔离级别极客时间()

初识事务隔离事务隔离级别的出现都是针对数据库的具体问题的,SQL92标准对事务并发处理会存在的异常情况进行了分级,分别为脏读(DirtyRead)、不可重复读(Unrepeatab

初识事务隔离

事务隔离级别的出现都是针对数据库的具体问题的, sql-92标准对事务并发处理会存在的异常情况进行了分级, 分别为脏读(dirty read)、不可重复读(unrepeatable read)和幻读(phantom read).

三种异常

举个例子, 有个heros_temp表, 中有三条数据:
事务的隔离级别- 极客时间()

先说脏读, 现在访问数据库, 对数据库进行了一次insert操作, 插入一条"吕布"的记录, 事务未提交, 现在重新开启一个事务, 查询数据库可以将吕布的记录查询出来. 这个就是脏读.

不可重复读呢? 现在先查询数据库记录, 之后重新开启一个事务, 修改一条记录, 现在在前一个事务中再次查询可以查询出修改后的数据, 前后查询出的数据不一致. 这个就是不可重复度.

幻读呢? 现在先查询数据库, 之后开启新事务insert一条记录, 在第一个事务中再次查询会多出插入的记录, 这个就是"幻读".

  1. 脏读: 读到事务中还没有提交的数据(可能事务回滚, 这个时候读到的数据无意义)
  2. 不可重复读: 对某数据进行读取, 发现两次读取的结果不同, 也就是没有读到相同的内容.(重点在于一条数据的修改, 也就是update 和 delete) 这个因为有其他事务对这个数据同时进行了修改和删除.
  3. 幻读: 事务a根据条件查询得到了n条数据, 但此时事务b更改或者增加了m条符合事务a查询条件的数据, 这样当事务a再次进行查询的时候大仙有n + m条数据, 产生了幻读.(重点在于新增多条记录insert)

事务的隔离级别有哪些?

解决异常数量从少到多的顺序决定了隔离级别的高低, 这四种隔离级别从低祷告分别是: 读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和可串行化(serializable). 这个隔离级别解决的异常情况如下:
事务的隔离级别- 极客时间()

读未提交,也就是允许读到未提交的数据,这种情况下查询是不会使用锁的,可能会产生脏读、不可重复读、幻读等情况。

读已提交就是只能读到已经提交的内容,可以避免脏读的产生,属于 rdbms 中常见的默认隔离级别(比如说 oracle 和 sql server),但如果想要避免不可重复读或者幻读,就需要我们在 sql 查询的时候编写带加锁的 sql 语句。

可重复读,保证一个事务在相同查询条件下两次查询得到的数据结果是一致的,可以避免不可重复读和脏读,但无法避免幻读。mysql 默认的隔离级别就是可重复读。

可串行化,将事务进行串行化,也就是在一个队列中按照顺序执行,可串行化是最高级别的隔离等级,可以解决事务读取中所有可能出现的异常情况,但是它牺牲了系统的并发性。

模拟异常

模拟的数据库表如下:

-- ---------------------------- -- table structure for heros_temp -- ---------------------------- drop table if exists `heros_temp`; create table `heros_temp`  (   `id` int(11) not null,   `name` varchar(255) character set utf8 collate utf8_general_ci not null,   primary key (`id`) using btree ) engine = innodb character set = utf8 collate = utf8_general_ci row_format = dynamic;  -- ---------------------------- -- records of heros_temp -- ---------------------------- insert into `heros_temp` values (1, '张飞'); insert into `heros_temp` values (2, '关羽'); insert into `heros_temp` values (3, '刘备');

开启两个客户端, 由于mysql的默认隔离级别是可重复度, 所以需要先将级别设为读未提交:

mysql> show variables like 'transaction_isolation'; // 查询当前隔离级别 mysql> set session transaction isolation level read uncommitted; // 设置隔离级别为读未提交 mysql> set autocommit = 0; // 设置事务不自动提交(由于mysql的事务是自动提交的, 这里需要改一下)
脏读

客户端2中开启事务, 写入新英雄, 不要提交
事务的隔离级别- 极客时间()

客户端1中查看
事务的隔离级别- 极客时间()

模拟不可重复读

客户端1查询
事务的隔离级别- 极客时间()

客户端2修改
事务的隔离级别- 极客时间()

客户端1再次查询
事务的隔离级别- 极客时间()

模拟幻读

客户端1查询
事务的隔离级别- 极客时间()

客户端2新增
事务的隔离级别- 极客时间()

客户端1再次查询
事务的隔离级别- 极客时间()

隔离级别都是针对对应的异常问题, 并且隔离级别针对每种rdbms都是相同的, 不同的是实现的原理不同.
事务的隔离级别- 极客时间()

需要了解更多数据库技术:事务的隔离级别- 极客时间(),都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文讨论了在进行 MySQL 数据迁移过程中遇到的所有 .frm 文件报错的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • SQL 连接详解与应用
    本文详细介绍了 SQL 连接的概念、分类及实际应用,包括内连接、外连接、自连接等,并提供了丰富的示例代码。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本文详细探讨了Oracle数据库中Number和Float数据类型的特性和使用方法。通过对比分析,解释了Number类型在精度和范围上的优势,以及Float类型在处理科学计算时的灵活性。文章还介绍了Number数据类型的语法结构及其在实际应用中的最佳实践,帮助读者更好地理解和选择合适的数据类型以满足不同的业务需求。 ... [详细]
author-avatar
手机用户2502929291_707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有