Oracle处理方法
下面我们再看看Oracle数据库是如何实施类似操作的。首先,我打开一个SQLPlus实例执行下列查询语句(这个例子可以在Oracle 9i中示例中找到)。这个实例称做查询实例:
select first_name, last_name, salary
from hr.employees
where
department_id = 20;
代码返回两行数据。
然后,再打开另一个SQLPlus实例——更新实例来执行以下命令:
SQL> update hr.employees
2 set salary = salary * 1.05
3 where
4 department_id = 20
5 /
代码执行后回复消息称两行数据已被更新。
注意,以上代码中并每有像在SQL Server示例那样键入“begin tran”字样的代码。Oracle 的SQLPlus隐含启用交易(你还可以模仿SQL Server的行为,设置“autocommit to on”自动地提交交易)。接下来我们在SQLPlus更新实例中再执行同查询实例一样的select语句。
结果清楚地表明:Michael和Pat的薪水都增加了,然而这个时候我还没有提交数据变更交易。
Oracle不需要用户等待数据更新实例中操作被提交,它径直返回Michael和Pat的查询信息,但实际上返回的是数据更新开始之前的数据视图!
这时候,熟悉SQL Server的人可能会说了,在查询中设置(NOLOCK)不也能达到同样的效果吗?可是,对SQL Server而言,在数据映像之前是不能获取数据的。指定(NOLOCK)实际上只是得到了没有提交的数据。Oracle的方法则提供了数据的一致视图,所有的信息都是针对交易的、基于存储数据快照的。
如果在SQLPlus的更新实例中提交更新交易在查询实例中就能看到薪水数据发生变化。如果在查询实例中重新运行先前的查询语句,那么Oracle将返回新的薪水数值。
