Welcome 微信登录

首页 / 数据库 / MySQL / Oracle PL/SQL之自定义函数的读一致性

读一致性即确保查询的结果与发起查询的时刻的数据一致,不管在此查询期间其他事务有没有更改数据。首先假设我们有如下函数用来根据部门id求该部门的总薪资:
  1. CREATE OR REPLACE FUNCTION sum2(p_deptno IN NUMBER)  
  2.   RETURN NUMBER IS --PRAGMA AUTONOMOUS_TRANSACTION;  
  3. l_ret NUMBER;  
  4. BEGIN  
  5.   dbms_lock.sleep(5);  
  6.   --DBMS_BACKUP_RESTORE.SLEEP(5);  
  7.   dbms_output.put_line(systimestamp);  
  8.   SELECT SUM(sal)  
  9.   INTO   l_ret  
  10.   FROM   emp  
  11.   WHERE  deptno = p_deptno;  
  12.   RETURN l_ret;  
  13. END sum2;  
然后我们开个session(s1),执行如下查询(q1):
  1. SELECT deptno  
  2.       ,SUM(sal)  
  3.       ,sum2(deptno)  
  4.       ,systimestamp  
  5. FROM   emp  
  6. GROUP  BY deptno;  
在q1执行的过程中,我们又开个新的session(s2),执行更新命令并提交:
  1. SQL> update emp set sal=sal+1;  
  2.    
  3. 14 rows updated  
  4.    
  5. SQL> commit;  
  6.    
  7. Commit complete  
  8.    
  9. SQL>   
接着回到s1,看q1的执行结果:
  1. SQL> SELECT deptno  
  2.   2        ,SUM(sal)  
  3.   3        ,sum2(deptno)  
  4.   4        ,systimestamp  
  5.   5  FROM   emp  
  6.   6  GROUP  BY deptno;  
  7.    
  8. DEPTNO   SUM(SAL) SUM2(DEPTNO) SYSTIMESTAMP  
  9. ------ ---------- ------------ --------------------------------------------------------------------------------  
  10.     30       9400         9406 24-JUN-11 08.31.19.722000 PM +08:00  
  11.     20      10875        10880 24-JUN-11 08.31.19.722000 PM +08:00  
  12.     10       8750         8753 24-JUN-11 08.31.19.722000 PM +08:00  
  13.    
  14. SQL>   
我们发现sum(sal)和sum2(deptno)的结果不一致。当我们将自定义函数应用于sql语句中,而该sql又需要执行很长时间,并且在这段时间中恰好又有其他dml会更改该sql中的某些表时,这种不一致就会体现出来。 关于如何避免这种不一致,可以使用SET TRANSACTION READ ONLY,详细内容可参看我下面的这篇文章:Oracle PL/SQL之SET TRANSACTION READ ONLY(事务隔离性) http://www.linuxidc.com/Linux/2011-07/39200.htmOracle DBA之配置静态监听(listener registered statically)Oracle PL/SQL之SET TRANSACTION READ ONLY(事务隔离性)相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数