oracle并发控制简述(多版本和读一致性)

一、什么是并发控制

并发控制(concurrency control)是数据库提供的函数集合,允许多个人同时访问和修改数据。前一章曾经说过,锁(lock)是oracle管理共享数据库资源并发访问,并防止并发数据库事务之间“相互干涉”的核心机制之一。

总结一下,oracle使用了多种锁,包括:

TX锁:修改数据的事务在执行期间会获得这种锁。

TM锁和DDL锁:在你修改一个对象的内容(对于TM锁)或对象本身(对应DDL锁)时,这些锁可以确保对象的结构不被修改。

闩(latch):这是oracle的内部锁,用来协调对其共享数据结构的访问。

oracle的多版本:

多版本是指,oracle能同时物化多个版本的数据,数据读相对于某个时间点有一致的结果。

多版本有一个很好的副作用,即数据的读取器(reader)绝对不会被数据的写入器(writer)所阻塞。换句话说,写不会阻塞读。

二、事务隔离级别

事务隔离级别是根据3个“现象”定义的,以下就是给定隔离级别可能允许或不允许的3种现象:

脏读(dirty read):这个词不仅不好听,实际上也确实是贬义的。你能读取未提交的数据,也就是脏数据。只要打开别人正在读写的一个OS文件(不论文件中有什么数据),就可以达到脏读的效果。如果允许脏读,将影响数据完整性,另外外键约束会遭到破坏,而且会忽略惟一性约束。

不可重复读(nonrepeatable read):这意味着,如果你在T1时间读取某一行,在T2时间重新读取这一行时,这一行可能已经有所修改。也许它已经消失,有可能被更新了,等等。

幻像读(phantom read):这说明,如果你在T1时间执行一个查询,而在T2时间再执行这个查询,此时可能已经向数据库中增加了另外的行,这会影响你的结果。与不可重复读的区别在于:在幻像读中,已经读取的数据不会改变,只是与以前相比,会有更多的数据满足你的查询条件。

ANSI/ISO SQL92标准中定义了4种事务隔离级别:

1、序列化(serializable)

最高隔离级别。系统中所有的事务都是一个接一个执行的。因此也就不会发生任何事务之间的冲突问题。

2、可重复读(repeatable read)

一个事务所读取的数据记录不允许被其他事务所修改。

3、读已提交(read committed)

该级别允许其他事务修改当前事务所读取的数据记录,并且那个事务提交之后,当前事务可以看到修改后的数据。

4、读未提交(read uncommitted)

该级别允许其他事务修改当前事务所读取的数据记录,并且那个事务尚未提交时,当前事务就可以看到修改后的数据。即允许脏读。
继续阅读oracle并发控制简述(多版本和读一致性)