Oracle PL/SQL之自定义函数的读一致性

Linux大全评论723 views阅读模式

读一致性即确保查询的结果与发起查询的时刻的数据一致,不管在此查询期间其他事务有没有更改数据。

首先假设我们有如下函数用来根据部门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中的某些表时,这种不一致就会体现出来。 

企鹅博客
  • 本文由 发表于 2019年9月7日 11:16:09
  • 转载请务必保留本文链接:https://www.qieseo.com/153994.html

发表评论