浅谈数据库的隔离等级

数据库事务的隔离等级,英语叫做 Transaction Isolation Level。

最近在给客户维护项目的时候,对一个表在两个进程中同时做更新和查询时碰到了死锁(DeadLock),数据表里有几百万上千万条记录,上面的处理当时是更新几千条记录,

查询整张表。

这是前提,为了搞明白这个死锁,大概涉及到死锁,隔离等级,锁升级以及Trace跟踪的内容,陆续整理出来,今天说说隔离等级。

概要

有下面3种读取不具合的现象,首先说说关于RDBMS的ACID特性的I(Isolation-隔离性)

·脏读

·不可重复读

·幻影读

接着说说事务隔离等级的4个等级。

·Read uncommitted

·Read committed

·Repeatable read

·Serializable

越往下隔离等级越高,越往上隔离等级越低。

对于最高的隔离等级,上边的3中读取不具合现象就不会发生了。但是,系统性能就会有很大的损失。

大概可以总结为[想要提升系统性能就要接受一定程度的读取不具合,如果即使性能低一些也没有关系那就不会发生读取上的不具合]

读取不具合

说明一下这3中读取不具合现象

脏读

读取到别的事务还没有提交的数据的现象:

1.事务A要把记录a更新到记录b(还没提交时)

2.事务B查询了记录

3.事务A做了回滚

4.事务B读到了记录b

这是把隔离等级设到最低级别了啊,还没见过这样的系统。

不可重复读

读到了别的事务更新后的数据,导致出现了非连贯性的读取操作。

1.事务A查询了记录,称之为a

2.事务B把记录a的内容更新到记录b,并且提交了。

3.事务A对记录a再次进行查询,取得的内容已经变成了记录b。

幻影读

看到了其它事务插入的记录导致出现的非连贯现象。

1.事务A查询记录时没有记录。

2.事务B插入记录并提交。

3.事务A再次查询记录时取得了事务B插入的记录。

是不是感觉和不可重复读有点像呀,重点在是插入操作还是更新操作。

另外,下面也是幻影读

1.事务A统计记录是X件。

2.事务B插入记录并提交。

3.事务A再次统计记录,取得的件数是X+1件。

这就是关于读取操作的3种不具合现象。

事务隔离等级和读取不具合的关系

  脏读 不可重复读 幻影读
Read uncommitted 发生   发生 发生
Read committed 不发生 发生 发生
Repeatable read 不发生 不发生 发生
Serializable 不发生 不发生 不发生

这样看是不是觉得每次都选择设置隔离等级为Serializable(可序列化)就一劳永逸了呀,

其实隔离性设置高了也是有问题的啊。这文就不说明了,要不又是一大段,有兴趣的调查下吧。

关于几个重点

·设置隔离等级也不能说就一定可以保证不会发生对应的某种错误。和具体的数据库实装RDBMS有很大

关系,例如MySQL的REPEATABLE READ的隔离等级也不会发生幻影读。

·所谓的【保证不发生】,为了不发生错误而采取的处理方法也因数据库RDBMS而不同。在发生异常时

有些数据库会报异常,有的会等待事务结束。

·数据库RDBMS的默认隔离等级各异,对应的隔离级别也不同。

MySQL(InnoDB) REPEATABLE READ    
PostgreSQL READ COMMITTED    
Oracle READ COMMITTED    
SQL Server READ COMMITTED    

就这样,写这点也挺花时间,有空再更新关于SQLServer的死锁,锁升级和Trace跟踪。

时间: 2024-10-05 05:41:05

浅谈数据库的隔离等级的相关文章

浅谈数据库框架,见笑,请多指正

浅谈数据库框架,见笑,请多指正 http://weibo.com/p/1001603724746155003486 一友说"插件式存储又割裂了SQL引擎的完整逻辑...总体而言在现有框架下MySQL的优化器没有多大改进的价值". 我们且做个技术分析: 1 插件式框架,可以静态/动态加载组件,方便在同类不同属家的模块间切换,这种设计是良好的. 很多软件的设计都采用了"微内核+插件"这样的方式构筑了强大的应用.如Ecplise生态圈. 2 数据库范围内, MySQL的属

浅谈数据库去重

关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出.推荐网址:www.4-yecao.com 关于sql去重最常见的有两种方式:DISTINCT和ROW_NUMBER(),当然了ROW_NUMBER()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的. 假如有张UserInfo表,如下图: 现在我们要去掉完全重复的数据:SELECT DISTINCT * FROM dbo.UserInfo结果如下图: 但是现在有个新的需求,要把名字为‘张三

浅谈数据库设计技巧(转)

说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法.面向对象的程序开发,要做的第一件事就是,先分析整个程序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类,再在其中逐步添加处理其数据的函数(即算法),最后,再给类中的数据成员和函数划分访问权限,从而实现封装. 数据库的最初雏形据说源

浅谈数据库设计

浅谈数据库设计 数据库设计的重要性:好的数据库设计有下面的一些作用: 1.首先充分体现系统的需求,数据库是为应用服务的,好的数据库设计应该首先能满足应用系统的业务需求,准确的表达数据间关系. 2.保证数据的准确性和一致性,通过主外键.非空.限制.唯一索引等保证数据的健壮. 3.提高数据的查询效率,通过合理表结构,安排物理存储分区.增加索引等方式,提高数据的读取速度,提高查询效率. 4.有好的扩展性,在必要时能根据需求扩展数据结构. 在系统设计中对数据库的设计应考虑哪些设计原则  数据库是整个软件

浅谈数据库之存储过程

浅谈数据库之存储过程 什么是存储过程 如果你接触过其他的编程语言,那么就好理解了,存储过程就像是方法一样. 竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名有存储过程参数也有返回值. 存储过程的优点:    存储过程的能力大大增强了SQL语言的功能和灵活性. 可保证数据的安全性和完整性. 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全. 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性. 在运行存储过程前,

浅谈数据库并发控制 - 锁和 MVCC

在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程:而并发(Concurrency)使一切事情的发生都有了可能,它能够解决一定的性能问题,但是它会带来更多诡异的错误. 引入了并发事务之后,如果不对事务的执行进行控制就会

浅谈数据库隔离级别

本文介绍了关系型数据库的隔离性.ANSI标准里面定义了Read Committed, Repeatable Read, Serializable隔离级别,Jim Gray等针对ANSI的标准提出了改进,并介绍了Cursor Stability, Snapshot Isolation等隔离级别. http://loopjump.com/db_isolation_level/

谈数据库事务隔离性

写在前面 近两年分布式数据库技术加速发展,而由于金融行业技术生态的限制,周围很多同学对其并没有深入的了解,所以进行高性能.高可靠系统设计时往往缺少这一利器.Ivan希望以系列文章的方式与大家交流探讨,加深我们对分布式数据库的认识.本文是该系列文章的第一篇,主要探讨事务管理中的隔离性,厘清相关概念和关键技术,为后面阐述分布式数据库的事务管理做一个铺垫,姑且算是一篇前传吧. 正文 我们首先从定义出发,事务管理包括原子性.一致性.隔离性和持久性四个方面,即ACID.所有数据库专著都会给出这个四个特性的

浅谈数据库的锁

数据库对于程序猿来 并不陌生,但是数据库的锁你知道多少?数据库的锁直接影响数据性能,在大并发的前提下,怎么保证数据不被死锁,提高数据库性能?如何加锁,何时加锁,加什么锁,你可以通过hint手工强行指定,但大多是数据库系统自动决定的.这就是为什么我们可以不懂锁也可以写SQL. 下面我们来简单谈一谈数据库中的锁,以sqlserver 为例: 数据库锁的种类: 1.共享锁(Shared lock) 何为共享锁,顾名思义意思就是资源共享,所以共享锁之间 是没有时间等待的可以同时执行一条或多条查询语句,共