热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

隔离级别-mysql教程

自从知道事务的隔离级别已经很长时间了,一直处于半理解的状态,这几天看了很多的博客,对隔离级别有了更深的了解,觉得很有必要把自己的理解写下来。1.首先我们要知道为什么事务要分隔离级别。如果没有隔离级别的话,数据库操作过程中会出现一下状况更

自从知道事务的隔离级别已经很长时间了,一直处于半理解的状态,这几天看了很多的博客,对隔离级别有了更深的了解,觉得很有必要把自己的理解写下来。 1.首先我们要知道为什么事务要分隔离级别 。 如果没有隔离级别的话,数据库操作过程中会出现一下状况 更

自从知道事务的隔离级别已经很长时间了,一直处于半理解的状态,这几天看了很多的博客,对隔离级别有了更深的了解,觉得很有必要把自己的理解写下来。
1.首先我们要知道为什么事务要分隔离级别
如果没有隔离级别的话,数据库操作过程中会出现一下状况
更新丢失(Lost update)

  两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读(Dirty Reads)

  一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。

不可重复读(Non-repeatable Reads)

  一个事务对同一行数据重复读取两次,但是却得到了不同的结果。它包括以下情况:

  (1) 事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。

  (2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

可能有些人看到这些概念会有似是而非的感觉,为了能让大家更好的理解这些概念,网站空间,下面我们通过例子说明这几种情况

Create Table Student
(
Name varchar(50),
Age int,
Address varchar(50)
)

Insert into Student values('小明',15,'北京')
Insert into Student values('小王',16,'天津')

a.更新丢失
有两个事务T1 和T2
T1操作为
update student set Age = 16 where name ='小明'
T2操作为
update student set Address = '武汉' where name ='小明'
T1 与T2同是开始,也就是T1和T2这两个事务开始的时候 小明信息为('小明',15,'北京')
T1成功,小明信息更改为 ('小明',16,'北京');
T2失败,事务回滚到操作之前的状态 小明信息变为('小明',15,'北京')
T2的失败造成T1的更新丢失,这就叫做更新丢失,避免更新丢失的方法就是加排他写锁,排他写锁就是当一个事务在编辑这条信息的时候,禁止其他事务进行写操作。
2.脏读
一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。(即B用户读取了一个A用户没有提交事务的数据(rollback transaction),这样读出来的数据是属于脏数据)

下面是简单的例子来实现脏读:
首先T1为
begin tran
update Student set Age = 16 where Name = ‘小明’
waitfor delay '00:00:05' --延迟五秒
rollback tran --回滚事务
事务T2
select * from Student with(nolock) where Name = ‘小明’
-- 加 with(nolock)可以读到未提交的数据,能提高查询性能,但它并不是没有缺点的,服务器空间,作为一个负面影响,nolock查询还可能带来读取“幻影”数据或读取在一个数据库读取事务中可以获得的但在另一个事务中可能被滚回的数据的风险。

先执行T1,一两秒之后执行T2,五秒之后再次执行T2,会发现中间有一个查询结果小明年龄为16,后来因为事务回滚,造成查询结果又变回为15,而年龄为16的这条数据就是脏数据。
3. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,虚拟主机,因此称为是不可重复读。
事务1第一次读小明的年龄为15
事务2更新小明年龄为16
事务1第二次读小明年龄为16
事务1的两次查询不一样
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题
4. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务1第一次查询学生信息为两条数据
事务2向学生表中插入一条新的信息
事务1第二次查询学生信息是发现多了一条 产生幻读
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

2. 隔离级别

推荐阅读
  • System Center Operations Manager 2007(简称SCOM 2007)作为MOM 2005的升级版,不仅整合了监控与管理功能,还显著简化了操作流程,提供了更加全面和精准的服务管理。 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 工作中频繁在不同Linux服务器之间切换时,频繁输入密码不仅耗时还影响效率。本文介绍如何通过设置SSH密钥认证,简化登录流程,提高工作效率。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
  • 在日常运维中,频繁地对多台Linux服务器进行用户管理是一项耗时的任务。为了提高效率,可以通过编写Expect脚本来实现远程自动化操作,从而简化这一过程。 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • 本文将详细探讨MySQL中较为特殊的三种数据类型:SQLTEXT、DATE以及SET,包括它们的基本用法、适用场景及一些高级特性。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • RabbitMQ 核心组件解析
    本文详细介绍了RabbitMQ的核心概念,包括其基本原理、应用场景及关键组件,如消息、生产者、消费者、信道、交换机、路由键和虚拟主机等。 ... [详细]
  • 最新进展:作为最接近官方声明的信息源,本文吸引了大量关注。若需获取最新动态,请访问:lkhill.com/ccie-version-5-update ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
author-avatar
当官的好办事_625
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有