设为首页 加入收藏

TOP

事务隔离等级(一)
2014-11-24 03:07:30 】 浏览:172
Tags:事务 隔离 等级
This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.(2009年1月)

看到wikipedia中文关于数据库相关的几个经典条目有点老旧,尤其和英文条目相比。确定开始翻译其中几篇,先从事务隔离等级开始。格式采用维基Sandbox发布后的格式。翻译完后自己校对过几遍,质量还可以。:-)
User:Pinuo
From Wikipedia, the free encyclopedia
Jump to: navigation, search
事务隔离(isolation)定义了数据库系统中一个操作产生的影响什么时候以哪种方式可以对其他并发操作可见。隔离是事务ACID(原子性、一致性性、隔离性、持久性)四大属性中的一个重要属性。
Contents
1并发控制(Concurrency control)2隔离级别(Isolation levels)
2.1可序列化(Serializable)2.2可重复读(Repeatable reads)2.3授权读(Read committed)2.4未授权读(Read uncommitted) 3默认隔离级别4读现象(Read phenomena)
4.1脏读(Dirty reads (Uncommitted Dependency))4.2不可重复读(non-repeatable read)4.3幻影读(phantom read) 5隔离级别、读现象和锁(Isolation Levels, Read Phenomena and Locks)
5.1隔离级别vs读现象(Isolation Levels vs Read Phenomena)5.2隔离级别vs锁持续时间(Isolation Levels vs Lock Duration) 6参照7相关条目8外部链接

并发控制(Concurrency control)

并发控制描述了数据库处理隔离以保证数据正确性的机制。为了保证并行事务执行的准确执行数据库和存储引擎在设计的时候着重强调了这一点。典型的事务相关机制限制数据的访问顺序(执行调度)以满足可序列化 和可恢复性。限制数据访问意味着降低了执行的性能,并发控制机制就是要保证在满足这些限制的前提下提供尽可能高的性能。经常在不损害正确性的情况下,为了达到更好的性能,可序列化的的要求会减低一些,但是为了避免数据一致性的破坏,可恢复性必须保证。

两阶段锁是关系数据库中最常见的提供了可序列化 和可恢复性的并发控制机制,为了访问一个数据库对象,事务首先要获得这个对象的锁。对于不同的访问类型(如对对象的读写操作)和锁的类型,如果另外一个事务正持有这个对象的锁,获得锁的过程会被阻塞或者延迟。

隔离级别(Isolation levels)

在数据库事务的ACID四个属性中,隔离性是一个最常放松的一个。为了获取更高的隔离等级,数据库系统的锁机制或者多版本并发控制机制都会影响并发。应用软件也需要额外的逻辑来使其正常工作。

很多DBMS定 义了不同的“事务隔离等级”来控制锁的程度。在很多数据库系统中,多数的数据库事务都避免高等级的隔离等级(如可序列化)从而减少对系统的锁定开销。程序 员需要小心的分析数据库访问部分的代码来保证隔离级别的降低不会造成难以发现的代码bug。相反的,更高的隔离级别会增加死锁发生的几率,同样需要编程过程中去避免。

ANSI/ISOSQL定义的标准隔离级别如下。

可序列化(Serializable)

最高的隔离级别。

在基于锁机制并发控制的DBMS实现可序列化要求在选定对象上的读锁和写锁保持直到事务结束后才能释放。在SELECT 的查询中使用一个“WHERE”子句来描述一个范围时应该获得一个“范围锁(range-locks)”。这种机制可以避免“幻影读(phantom reads)”现象。

当采用不基于锁的并发控制时不用获取锁。但当系统探测到几个并发事务有“写冲突”的时候,只有其中一个是允许提交的。这种机制的详细描述见“'快照隔离”

可重复读(Repeatable reads)

在可重复读(REPEATABLE READS)隔离级别中,基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束,但不要求“范围锁(range-locks)”,因此可能会发生“幻影读(phantom reads)”

授权读(Read committed)

在授权读(READ COMMITTED)级别中,基于锁机制并发控制的DBMS需要对选定对象的写锁(write locks)一直保持到事务结束,但是读锁(read locks)在SELECT操作完成后马上释放(因此“不可重复读”现象可能会发生,见下面描述)。和前一种隔离级别一样,也不要求“范围锁(range-locks)”。

简而言之,授权读这种隔离级别保证了读到的任何数据都是提交的数据,避免读到中间的未提交的数据,脏读(dirtyreads)。但是不保证事务重新读的时候能读到相同的数据,因为在每次数据读完之后其他事务可以修改刚才读到的数据。

未授权读(Read uncommitted)

未授权读(READ UNCOMMITTED)是最低的隔离级别。允许脏读(dirty reads),事务可以看到其他事务“尚未提交”的修改。

通过比低一级的隔离级别要求更多的限制,高一级的级别提供更强的隔离性。标准允许事务运行在更强的事务隔离级别上。(如在可重复读(REPEATABLE READS)隔离级别上执行授权读(READ COMMITTED)的事务是没有问题的)

默认隔离级别

不同的DBMS默认隔离级别也不同。多少数据库允许用户设置隔离级别。有些DBMS在执行一个SELECT语句时使用额外的语法来获取锁(如SELECT ... FOR UPDATE来获得在访问的数据行上的排他锁)

读现象(Read phenomena)

ANSI/ISO 标准SQL 92涉及三种不同的一个事务读取另外一个事务可能修改的数据的“读现象”。

下面的例子中,两个事务,事务1执行语句1。接着,事务2执行语句2并且提交,最后事务1再执行语句1. 查询使用如下的数据表。

users

id

name

age

1

Joe

20

2

Jill

25

脏读(Dirty reads (UncommittedDependency))

当一个事务允许读取另外一个事务修改但未提交的数据时,就可能发生脏读(dirty reads)。

脏读(dirty reads)和不可重复读(non-repeatablereads)类似。事务2没有提交造成事务1的语句1两次执行得到不同的结果集。在未授权读(READ UNCOMMITTED)隔离级别唯一禁止的是更新混乱,即早期的更新可能出现在后来更新之前的结果集中。

在我们的例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了。

事务 1

事务 2

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何用Java将excel数据导入数据库 下一篇MongoDB:mongodb的主从复制(一)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目