对于以Oracle后台的开发人员了解Oracle多版本和一致读尤其重要,因为它在很大程度上提升了数据库的并行操作。如果对并发了解的不够,通常会遇到以下几种情况:
1、破坏了数据的完整性
2、随着用户数的增多,应用的运行速度减慢
3、不能很好的扩展应用来支持大量用户
介绍多版本和一致读之前先来了解下Oracle的锁机制:
1、Oracle只在修改时才对数据加载行级锁
2、写入器不会阻塞读取器(其他数据库中往往读会被写阻塞)
3、写入器想写某行数据,但另外一个写入器锁定了这行数据,此时写入器才会被阻塞
明白了锁机制,下面就进入正题。多版本:是指Oracle能够从数据库同时物化多个版本的数据,为读一致性提供数据基础;
读一致性:Oracle中的查询会从某个一致的时间点开始返回,查询中的每个块都从同一个时间点开始,即使它在查询中时被修改或锁定;
考虑这样一件事,有一家银行一共100个客户,每个客户存款500,当系统要查看所有的客户存款统计,答案当然是50000。如果没有以上机制则在统计期间ID=1的客户把500块钱转到ID=100的客户,而统计已经统计过ID=1的客户还没有统计ID=100的客户,那么此时ID=100的客户存款就为1000,最终sum到ID=100的客户时统计结果将是50500。答案是错误的!采用多版本和读一致性不仅提高了并行度,还保证了数据的正确性。
当你修改数据的时候,Oracle将会在两个不同的位置创建记录,一个是重做日志,另一个是回滚段。某一行的数据被修改,该行会增加一个行级锁,当读取这行数据时发现有行级锁则读取回滚段,从而保证读一致性。
也许有人会问既然这是Oracle的内部机制,对于开发人员来说有什么用?确实很有用,你有可能接触过其他数据库然后把其他数据库的经验用到了Oracle上,造成了不必要的锁机制;或者避免当你遇到并发瓶颈时增加了没有必要的代码;最主要的是当您在Oracle数据库基础上写了大量代码突破了并行的瓶颈正洋洋得意时,您的DBA说:“这些Oracle很久以前已经实现了...”;