欢迎来到天天文库
浏览记录
ID:57731585
大小:286.28 KB
页数:16页
时间:2020-03-25
《oracle 专家高级编程 中文第七章.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第7章并发与多版本上一章曾经说过,开发多用户的数据库驱动应用时,最大的难题之一是:一方面要力争最大的并发访问,与此同时还要确保每个用户能以一致的方式读取和修改数据。这一章我们将进一步详细地讨论Oracle如何获得多版本读一致性(multi-versionreadconsistency),并说明这对于开发人员来说意味着什么。我还会介绍一个新概念,即写一致性(writeconsistency),并用这个概念来说明Oracle不仅能在提供读一致性的读环境中工作,还能在混合读写环境中工作。7.1什么是并发控制?并
2、发控制(concurrencycontrol)是数据库提供的函数集合,允许多个人同时访问和修改数据。前一章曾经说过,锁(lock)是Oracle管理共享数据库资源并发访问并防止并发数据库事务之间“相互干涉”的核心机制之一。总结一下,Oracle使用了多种锁,包括:qTX锁:修改数据的事务在执行期间会获得这种锁。qTM锁和DDL锁:在你修改一个对象的内容(对于TM锁)或对象本身(对应DDL锁)时,这些锁可以确保对象的结构不被修改。q闩(latch):这是Oracle的内部锁,用来协调对其共享数据结构的访问。
3、不论是哪一种锁,请求锁时都存在相关的最小开销。TX锁在性能和基数方面可扩缩性极好。TM锁和DDL锁要尽可能地采用限制最小的模式。闩和队列锁(enqueue)都是轻量级的,而且都很快(在这二者中,队列锁相对“重”一些,不过,它的功能也更丰富)。如果应用设计不当,不必要地过长时间保持锁,而导致数据库中出现阻塞,就会带来问题。如果能很好地设计代码,利用Oracle的锁定机制就能建立可扩缩的高度并发的应用。但是Oracle对并发的支持不只是高效的锁定。它还实现了一种多版本(multi-versioning)体系结
4、构(见第1章的介绍),这种体系结构提供了一种受控但高度并发的数据访问。多版本是指,Oracle能同时物化多个版本的数据,这也是Oracle提供数据读一致视图的机制(读一致视图即read-consistentview,是指相对于某个时间点有一致的结果)。多版本有一个很好的副作用,即数据的读取器(reader)绝对不会被数据的写入器(writer)所阻塞。换句话说,写不会阻塞读。这是Oracle与其他数据库之间的一个根本区别。在Oracle中,如果一个查询只是读取信息,那么永远也不会被阻塞。它不会与其他会话发
5、生死锁,而且不可能得到数据库中根本不存在的答案。注意在分布式2PC(两段提交)的处理期间,在很短的一段时间内Oracle不允许读信息。因为这种处理相当少见,而且属于例外情况(只有查询在准备阶段和提交阶段之间开始,而且试图在提交之前读取数据,此时才会存在这个问题),所以我不打算详细介绍这种情况。默认情况下,Oracle的读一致性多版本模型应用于语句级(statementlevel),也就是说,应用于每一个查询;另外还可以应用于事务级(transactionlevel)。这说明,至少提交到数据库的每一条SQL
6、语句都会看到数据库的一个读一致视图,如果你希望数据库的这种读一致视图是事务级的(一组SQL语句),这也是可以的。数据库中事务的基本作用是将数据库从一种一致状态转变为另一种一种状态。ISOSQL标准指定了多种事务隔离级别(transactionisolationlevel),这些隔离级别定义了一个事务对其他事务做出的修改有多“敏感”。越是敏感,数据库在应用执行的各个事务之间必须提供的隔离程度就越高。在下一节中我们就看到,Oracle如何利用多版本体系结构和绝对最小锁定(absolutelyminimallo
7、cking)来支持SQL标准定义的各种隔离级别。7.2事务隔离级别ANSI/ISOSQL标准定义了4种事务隔离级别,对于相同的事务,采用不同的隔离级别分别有不同的结果。也就是说,即使输入相同,而且采用同样的方式来完成同样的工作,也可能得到完全不同的答案,这取决于事务的隔离级别。这些隔离级别是根据3个“现象”定义的,以下就是给定隔离级别可能允许或不允许的3种现象:q脏读(dirtyread):这个词不仅不好听,实际上也确实是贬义的。你能读取未提交的数据,也就是脏数据。只要打开别人正在读写的一个OS文件(不论
8、文件中有什么数据),就可以达到脏读的效果。如果允许脏读,将影响数据完整性,另外外键约束会遭到破坏,而且会忽略惟一性约束。1q不可重复读(nonrepeatableread):这意味着,如果你在T1时间读取某一行,在T2时间重新读取这一行时,这一行可能已经有所修改。也许它已经消失,有可能被更新了,等等。q幻像读(phantomread):这说明,如果你在T1时间执行一个查询,而在T2时间再执行这个查询,此时可能已经向数据库中增加
此文档下载收益归作者所有