首页 > 数据库 >数据库隔离级别 整理

数据库隔离级别 整理

时间:2023-07-28 19:04:37浏览次数:33  
标签:事务 隔离 数据库 文档 提交 级别


一、隔离级别及含义


事务隔离级别(transaction isolation levels):隔离级别就是对对事务并发控制的等级。ANSI/ ISO SQL将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE READ)、读已提交(READ COMMITED)、读未提交(READ UNCOMMITED)四个等级。为了实现隔离级别通常 数据库

采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。

串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。

读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。

二、数据库并发访问可能引起的问题


1. 脏读(事务没提交,提前读取):脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

2. 不可重复读(两次读的不一致) :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。  
3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。  
4.第一类更新丢失(回滚丢失): 
  当2个事务更新相同的数据源,如果第一个事务被提交,而另外一个事务却被撤销,那么会连同第一个事务所做的跟新也被撤销。也就是说第一个事务做的跟新丢失了。 
5.第二类更新丢失(覆盖丢失): 

  第二类更新丢失实在实际应用中经常遇到的并发问题,他和不可重复读本质上是同一类并发问题,通常他被看做不可重复读的特例:当2个或这个多个事务查询同样的记录然后各自基于最初的查询结果更新该行时,会造成第二类丢失更新。因为每个事务都不知道不知道其他事务的存在,最后一个事务对记录做的修改将覆盖其他事务对该记录做的已提交的跟新...

三、隔离级别图解


我觉得掌握数据库事务隔离级别的窍门在于:罗列出事务在并发时会发生哪些异常情况,什么样的隔离级别会杜绝这种异常情况的发生。下面就按照这个思路把数据库事务隔离级别再复习一遍。

      第一种可能出现的异常情况:丢失更新(Lost Update)

数据库隔离级别 整理_不可重复读

数据库事务隔离级别:Read Uncommitted可以避免此类异常

      第二种可能出现的异常情况:脏读(Dirty Read)

 

数据库隔离级别 整理_隔离级别_02

数据库事务隔离级别:Read Committed可以避免此类异常

      第三种可能出现的异常情况:不可重复读(Unrepeatable Read )

数据库隔离级别 整理_隔离级别_03

数据库事务隔离级别:Reaptalble Read可以避免此类异常

      第四种可能出现的异常情况:幻象读(Phantom Read)

数据库隔离级别 整理_隔离级别_04

数据库事务隔离级别:Serializable可以避免此类异常

 


下表是各隔离级别对各种异常的控制能力 



LU丢失更新

DR脏读

NRR非重复读

SLU二类丢失更新

PR幻像读

未提交读 RU

Y

Y

Y

Y

Y

提交读 RC

N

N

Y

Y

Y

可重复读 RR

N

N

N

N

Y

串行读 S

N

N

N

N

Y


标签:事务,隔离,数据库,文档,提交,级别
From: https://blog.51cto.com/u_6813689/6886171

相关文章

  • 最快嵌入式数据库CrossDB与SQLite3性能测试报告
    CrossDB是目前最快的高性能嵌入式关系数据库。测试工具:CrossBenchDB驱动:SQLite3CrossDB测试方法:随机访问,单线程,绑定CPU核测试服务器CPU:Intel(R)Xeon(R)[email protected] cachesize36864KBHDD:DELLPERCH755FrontSCSIDisk......
  • 百万级别数据,如何删除
    步骤1.优化索引对于大量数据的删除操作,优化索引是一种提高删除效率的策略,而不是直接删除索引。直接删除索引可能会导致删除操作变慢,而且重新建立索引也会占用一定时间。优化索引的目的是让数据库在进行删除操作时,能够更快速地定位要删除的记录,从而加快删除的速度。在删除大量数......
  • 基于 Kubernetes 部署 MySQL 数据库
    本文将介绍如何基于Kubernetes部署MySQL数据库。创建服务Service创建一个Service为即将部署的MySQL数据库固定连接的IP,同时提供负载均衡,下面是mysql-service.yaml文件的内容: yaml复制代码apiVersion:v1kind:Servicemetadata:name:mysqlspec:s......
  • 数据库数据恢复-断电导致Syabse数据库无法启动,存储页底层数据杂乱的数据恢复案例
    数据库恢复环境:Sybase版本:SQLAnywhere8.0。数据库故障:数据库所在的设备意外断电后,数据库无法启动。错误提示:使用SybaseCentral连接后报错:数据库故障分析:经过北亚企安数据恢复工程师检测,定位到数据库无法启动的原因:突然断电导致Sybase数据库无法正常回写数据,造成多个存......
  • oracle数据库中的%type 及%rowtype
    1%TYPE说明为了使一个变量的数据类型与另一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式。当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的......
  • SqlServer备份数据库语句
    Declare@DataStrNVARCHAR(200)set@DataStr=convert(NVARCHAR(19),getdate(),120)set@DataStr=REPLACE(@DataStr,':','_')set@DataStr=REPLACE(@DataStr,'','_')set@DataStr=REPLACE(@DataStr,'-','......
  • 使用 docker 部署 mycat 中间件配置数据库读写分离、分库分表
    文章目录前言配置镜像配置文件server.xml服务配置文件,包含登录用户配置schema.xml逻辑表配置rule.xml分片规则将这三个配置文件放置到固定的位置,方便后面使用启动dockercomposedockercompose启动测试前言之前有一篇博客已经在docker中将mysql的主从配置讲述了,没有看的童......
  • postgresql 数据库 报错 FATAL: sorry, too many clients already 解决方法
    场景项目postgres连接不上,所有连接报错:psql:FATAL:sorry,toomanyclientsalready原由程序使用连接未及时释放,连接一直处于idle状态处理方式1、程序里面未释放的连接,在使用后及时释放;2、postgres连接数默认最大100个,在配置文件修改该参数;postgres.confmax_con......
  • 2023-07-28 后端接口返回的数据与postman返回的数据不一致 ==》前端不兼容数据库字段
    前言:在传参一致,接口一致的情况下,微信开发者工具调的接口和postman返回的数据的id不一致。具体为:微信开发者工具端调接口拿到的id为22位的数据:1884661033952220199看起来平平无奇对吧,而postman返回的id则为:1884661033952220200是的,接口一样,传参一样,返回的其它数据也一样,唯独这......
  • 释放全量数据价值,巨杉数据库再度入选Gartner研究报告
    巨杉数据库凭借灵活数据结构和智能化的数据管理能力,成功地入选Gartner《HypeCycleforData,AnalyticsandAIinChina,2023》报告。近日,Gartner公布《HypeCycleforData,AnalyticsandAIinChina,2023》报告(下简称报告),巨杉数据库凭借灵活数据结构和智能化的数据管理能......