热门标签 | 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都是相同的, 不同的是实现的原理不同.
事务的隔离级别- 极客时间()

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


推荐阅读
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
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社区 版权所有