- 在 Oracle 中使用一个连接。不论你想执行 5 个查询还是 500 个查询,都希望最多只打开一个连接。
- 确保尽可能的使用绑定变量。
- Oracle锁定策略:
- Oracle 只在修改时才对数据加行级锁。正常情况下不会升级到块级锁或表级锁(不过两段提交期间的一段很短的时间内除外,这是一个不常见的操作)。
-
如果只是读数据, Oracle 绝不会对数据锁定。不会因为简单的读操作在数据行上锁定。
-
写入器( writer )不会阻塞读取器( reader )。换种说法:读( read )不会被写( write ) 阻塞。这一点几乎与其他所有数据库都不一样。在其他数据库中,读往往会被写阻塞。尽管听上去这个特性似乎很不错(一般情况下确实如此),但是,如果你没有充分理解这个思想,而且想通过应用逻辑对应用施加完整性约束,就极有可能做得不对。
-
写入器想写某行数据,但另一个写入器已经锁定了这行数据,此时该写入器才会被阻塞。 读取器绝对不会阻塞写入器。
即:读既不会阻塞读,也不会阻塞写;写不会阻塞读,但会阻塞写。
Oracle 的无阻塞方法有一个副作用,如果确实想保证一次最多只有一个用户访问一行数据,开发人员就得自己做些工作。要加入我们自己的串行化机制来确保业务逻辑的正确性,如for update语句会使读操作也对相应的行加锁,确保了串行访问。
4. Oracle多版本
①、Oracle多版本特性是Oracle并发控制机制的基础, Oracle 采用了一种多版本、读一致( read-consistent )的并发模型。实质上讲, Oracle 利用这种机制提供了以下特性:
读一致查询:对于一个时间点( point in time ),查询会产生一致的结果。
非阻塞查询:查询不会被写入器阻塞,但在其他数据库中可能不是这样。
②、由于有多版本机制,Oracle中没有“共享读”锁的概念。
只要你修改数据, Oracle 就会创建撤销( undo )条目。这些 undo 条目写至 undo 段(撤销段, undo segment )。如果事务失败,需要撤销, Oracle 就会从这个回滚段读取 “ 之前 ” 的映像,并恢复数据。除了使用回滚段数据撤销事务外, Oracle 还会用它撤销读取块时对块所做的修改,使之恢复到查询开始前的时间点 。这样就能摆脱锁来得到一致、正确的答案,而无需你自己对任何数据锁定。
Oracle非阻塞读是这样实现的: Oracle 只看数据是否改变,它并不关心数据当前是否锁定(锁定意味着数据已经改变)。 Oracle 只是从回滚段中取回原来的值,并继续处理下一个数据块。
在数据库中,可以得到同一个信息处于不同时间点的多个版本。Oracle 能充分使用不同时间点的数据快照来提供读一致查询和非阻塞查询。
5.在SQL Server和Sybase中,NULL就等于NULL,但是,在Oracle中,NULL与NULL既不相等,也不完全不相等。
6.Oracle没有“共享读”锁。