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

隔离级别

自从知道事务的隔离级别已经很长时间了,一直处于半理解的状态,这几天看了很多的博客,对隔离级别有了更深的了解,觉得很有必要把自己的理解写下来。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. 隔离级别

推荐阅读
  • 本文详细探讨了在服务器上运行的PostgreSQL数据库出现'内存不足'错误的具体情况,并提供了一系列有效的解决策略。通过本文,读者将能够更好地理解这一常见问题及其背后的原理。 ... [详细]
  • HTTPS与TLS/SSL协议详解:握手及记录协议
    HTTPS,即HTTP over TLS/SSL,通过在HTTP通信层引入安全协议,确保数据传输的安全性。本文将深入探讨TLS/SSL协议的基本概念、HTTPS的必要性,以及TLS握手和记录协议的工作原理。 ... [详细]
  • 应对.avast后缀勒索病毒:全面指南
    本文详细介绍了.avast后缀勒索病毒的特性、感染途径、恢复方法及预防措施,旨在帮助用户有效应对这一威胁。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 解决vCenter vSphere HA初始化失败的问题
    本文探讨了在集群中遇到的所有vSphere HA主机状态显示‘无法正确安装或配置vSphere HA代理’错误的情况,并详细介绍了排查与解决步骤,包括检查HA初始化错误及安装HA代理的常见故障排除方法。 ... [详细]
  • 探讨在使用Rails框架创建数据库记录时,created_at字段未能正确反映系统当前时间的原因及解决方法。 ... [详细]
  • 在Windows Server 2008 R2上配置IIS FTP服务
    本文详细介绍了如何在Windows Server 2008 R2操作系统上通过IIS配置FTP服务的过程,包括服务器角色的选择与安装、FTP站点的创建以及必要的服务和防火墙设置检查。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文介绍如何在Laravel框架中集成微信支付功能,包括如何配置微信支付环境、处理支付请求及接收支付回调等关键步骤。 ... [详细]
  • 推荐两款实用的网络诊断工具
    大家好,因为一些私事很久没有更新博客了。今天向大家介绍两款非常有用的网络诊断工具——Tracert和Telnet,帮助你更好地理解和解决网络问题。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 三菱PLC SLMP协议报文详解
    本文详细解析了三菱PLC中使用的SLMP协议报文结构,包括其工作原理、通信流程及报文格式,旨在帮助工程师和技术人员更好地理解和运用这一协议。 ... [详细]
  • 使用C# .NET构建UDP点对点聊天应用
    本文详细介绍如何利用C# .NET框架开发一个基于UDP协议的点对点聊天程序,包括客户端与服务器之间的连接建立、数据传输等核心功能。 ... [详细]
  • 本指南详细介绍了如何在同一台计算机上配置多个GitHub账户,并使用不同的SSH密钥进行身份验证,确保每个账户的安全性和独立性。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
author-avatar
byd888_613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有